Ignore SIGSEGV and continue execution [duplicate]
up vote
0
down vote
favorite
This question already has an answer here:
Why can't I ignore SIGSEGV signal?
5 answers
I have a folder full of images that contain some metadata in the pixels that I'm trying to extract with my program. The program loops through each file, extracting the data. Problem is that some of the images are corrupted, and trying to extract data from them results in a segmentation fault.
Is there any way to catch this SIGSEGV signal and use it to ignore the current corrupted image and continue to the next noe?
try-catch will not help as this is a signal, not exception.
int Status::ExtractImageMetaData(cv::Mat src_in, int Index)
{
unsigned char *Image = (unsigned char *)(src_in.data);
unsigned char *StructByte = (unsigned char*) &ImageMetaData[Index];
uint32_t MetaOffset = (src_in.total() * src_in.elemSize()) - sizeof(ImageMetaData_t);
for(unsigned int i = 0; i < sizeof(ImageMetaData_t); i++)
{
StructByte[i] = Image[i + MetaOffset]; // SEGMENTATION FAULT HERE!
}
}
int main(int argc, char const *argv)
{
if (imagePath == NULL){
imagePath = "/Pictures/metadataExtractionTest/sqlTest/";
}
// Iterate over all files in the "imagePath"
for (const auto & p : fs::directory_iterator(imagePath)){
string FullImageDir = p.path();
Mat Img = imread(FullImageDir.c_str());
int MetaStatus = SystemStatus.ExtractImageMetaData(Img, 0);
printf("donen");
}
return 0;
}
c++
marked as duplicate by Raedwald, YSC
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 8 at 12:24
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
up vote
0
down vote
favorite
This question already has an answer here:
Why can't I ignore SIGSEGV signal?
5 answers
I have a folder full of images that contain some metadata in the pixels that I'm trying to extract with my program. The program loops through each file, extracting the data. Problem is that some of the images are corrupted, and trying to extract data from them results in a segmentation fault.
Is there any way to catch this SIGSEGV signal and use it to ignore the current corrupted image and continue to the next noe?
try-catch will not help as this is a signal, not exception.
int Status::ExtractImageMetaData(cv::Mat src_in, int Index)
{
unsigned char *Image = (unsigned char *)(src_in.data);
unsigned char *StructByte = (unsigned char*) &ImageMetaData[Index];
uint32_t MetaOffset = (src_in.total() * src_in.elemSize()) - sizeof(ImageMetaData_t);
for(unsigned int i = 0; i < sizeof(ImageMetaData_t); i++)
{
StructByte[i] = Image[i + MetaOffset]; // SEGMENTATION FAULT HERE!
}
}
int main(int argc, char const *argv)
{
if (imagePath == NULL){
imagePath = "/Pictures/metadataExtractionTest/sqlTest/";
}
// Iterate over all files in the "imagePath"
for (const auto & p : fs::directory_iterator(imagePath)){
string FullImageDir = p.path();
Mat Img = imread(FullImageDir.c_str());
int MetaStatus = SystemStatus.ExtractImageMetaData(Img, 0);
printf("donen");
}
return 0;
}
c++
marked as duplicate by Raedwald, YSC
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 8 at 12:24
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
2
You shouldn't catchSIGSEGV
. You should prevent it. If you have out of bounds array access, then check array size before you access it. Check fornull
as well.
– Yksisarvinen
Nov 7 at 9:37
1
Suggestions to cope with a segfault notwithstanding I must second @Yksisarvinen: The segfault probably comes because you blindly accept data from the files without checking it. Properly vetting the data for plausibility and specfication and implementation limits will (1) Probably allow you to tolerate some file corruption and still extract some image or meta data, and (2) make your program more secure. The last one is more important if you run it on third-party sources or even distribute it: Because maliciously crafted files could actually attack your computer.
– Peter A. Schneider
Nov 7 at 12:37
1
OK guys. Followed your advice and checked for columns and rows in the input images before trying to extract metadata from them. That did the trick
– eirikaso
Nov 7 at 12:42
Always nice to find the 'right' solution - i.e. one that fixes the underlying and properly understood problem.
– Rags
Nov 7 at 13:15
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
This question already has an answer here:
Why can't I ignore SIGSEGV signal?
5 answers
I have a folder full of images that contain some metadata in the pixels that I'm trying to extract with my program. The program loops through each file, extracting the data. Problem is that some of the images are corrupted, and trying to extract data from them results in a segmentation fault.
Is there any way to catch this SIGSEGV signal and use it to ignore the current corrupted image and continue to the next noe?
try-catch will not help as this is a signal, not exception.
int Status::ExtractImageMetaData(cv::Mat src_in, int Index)
{
unsigned char *Image = (unsigned char *)(src_in.data);
unsigned char *StructByte = (unsigned char*) &ImageMetaData[Index];
uint32_t MetaOffset = (src_in.total() * src_in.elemSize()) - sizeof(ImageMetaData_t);
for(unsigned int i = 0; i < sizeof(ImageMetaData_t); i++)
{
StructByte[i] = Image[i + MetaOffset]; // SEGMENTATION FAULT HERE!
}
}
int main(int argc, char const *argv)
{
if (imagePath == NULL){
imagePath = "/Pictures/metadataExtractionTest/sqlTest/";
}
// Iterate over all files in the "imagePath"
for (const auto & p : fs::directory_iterator(imagePath)){
string FullImageDir = p.path();
Mat Img = imread(FullImageDir.c_str());
int MetaStatus = SystemStatus.ExtractImageMetaData(Img, 0);
printf("donen");
}
return 0;
}
c++
This question already has an answer here:
Why can't I ignore SIGSEGV signal?
5 answers
I have a folder full of images that contain some metadata in the pixels that I'm trying to extract with my program. The program loops through each file, extracting the data. Problem is that some of the images are corrupted, and trying to extract data from them results in a segmentation fault.
Is there any way to catch this SIGSEGV signal and use it to ignore the current corrupted image and continue to the next noe?
try-catch will not help as this is a signal, not exception.
int Status::ExtractImageMetaData(cv::Mat src_in, int Index)
{
unsigned char *Image = (unsigned char *)(src_in.data);
unsigned char *StructByte = (unsigned char*) &ImageMetaData[Index];
uint32_t MetaOffset = (src_in.total() * src_in.elemSize()) - sizeof(ImageMetaData_t);
for(unsigned int i = 0; i < sizeof(ImageMetaData_t); i++)
{
StructByte[i] = Image[i + MetaOffset]; // SEGMENTATION FAULT HERE!
}
}
int main(int argc, char const *argv)
{
if (imagePath == NULL){
imagePath = "/Pictures/metadataExtractionTest/sqlTest/";
}
// Iterate over all files in the "imagePath"
for (const auto & p : fs::directory_iterator(imagePath)){
string FullImageDir = p.path();
Mat Img = imread(FullImageDir.c_str());
int MetaStatus = SystemStatus.ExtractImageMetaData(Img, 0);
printf("donen");
}
return 0;
}
This question already has an answer here:
Why can't I ignore SIGSEGV signal?
5 answers
c++
c++
edited Nov 7 at 9:34
asked Nov 7 at 9:24
eirikaso
267
267
marked as duplicate by Raedwald, YSC
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 8 at 12:24
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Raedwald, YSC
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 8 at 12:24
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
2
You shouldn't catchSIGSEGV
. You should prevent it. If you have out of bounds array access, then check array size before you access it. Check fornull
as well.
– Yksisarvinen
Nov 7 at 9:37
1
Suggestions to cope with a segfault notwithstanding I must second @Yksisarvinen: The segfault probably comes because you blindly accept data from the files without checking it. Properly vetting the data for plausibility and specfication and implementation limits will (1) Probably allow you to tolerate some file corruption and still extract some image or meta data, and (2) make your program more secure. The last one is more important if you run it on third-party sources or even distribute it: Because maliciously crafted files could actually attack your computer.
– Peter A. Schneider
Nov 7 at 12:37
1
OK guys. Followed your advice and checked for columns and rows in the input images before trying to extract metadata from them. That did the trick
– eirikaso
Nov 7 at 12:42
Always nice to find the 'right' solution - i.e. one that fixes the underlying and properly understood problem.
– Rags
Nov 7 at 13:15
add a comment |
2
You shouldn't catchSIGSEGV
. You should prevent it. If you have out of bounds array access, then check array size before you access it. Check fornull
as well.
– Yksisarvinen
Nov 7 at 9:37
1
Suggestions to cope with a segfault notwithstanding I must second @Yksisarvinen: The segfault probably comes because you blindly accept data from the files without checking it. Properly vetting the data for plausibility and specfication and implementation limits will (1) Probably allow you to tolerate some file corruption and still extract some image or meta data, and (2) make your program more secure. The last one is more important if you run it on third-party sources or even distribute it: Because maliciously crafted files could actually attack your computer.
– Peter A. Schneider
Nov 7 at 12:37
1
OK guys. Followed your advice and checked for columns and rows in the input images before trying to extract metadata from them. That did the trick
– eirikaso
Nov 7 at 12:42
Always nice to find the 'right' solution - i.e. one that fixes the underlying and properly understood problem.
– Rags
Nov 7 at 13:15
2
2
You shouldn't catch
SIGSEGV
. You should prevent it. If you have out of bounds array access, then check array size before you access it. Check for null
as well.– Yksisarvinen
Nov 7 at 9:37
You shouldn't catch
SIGSEGV
. You should prevent it. If you have out of bounds array access, then check array size before you access it. Check for null
as well.– Yksisarvinen
Nov 7 at 9:37
1
1
Suggestions to cope with a segfault notwithstanding I must second @Yksisarvinen: The segfault probably comes because you blindly accept data from the files without checking it. Properly vetting the data for plausibility and specfication and implementation limits will (1) Probably allow you to tolerate some file corruption and still extract some image or meta data, and (2) make your program more secure. The last one is more important if you run it on third-party sources or even distribute it: Because maliciously crafted files could actually attack your computer.
– Peter A. Schneider
Nov 7 at 12:37
Suggestions to cope with a segfault notwithstanding I must second @Yksisarvinen: The segfault probably comes because you blindly accept data from the files without checking it. Properly vetting the data for plausibility and specfication and implementation limits will (1) Probably allow you to tolerate some file corruption and still extract some image or meta data, and (2) make your program more secure. The last one is more important if you run it on third-party sources or even distribute it: Because maliciously crafted files could actually attack your computer.
– Peter A. Schneider
Nov 7 at 12:37
1
1
OK guys. Followed your advice and checked for columns and rows in the input images before trying to extract metadata from them. That did the trick
– eirikaso
Nov 7 at 12:42
OK guys. Followed your advice and checked for columns and rows in the input images before trying to extract metadata from them. That did the trick
– eirikaso
Nov 7 at 12:42
Always nice to find the 'right' solution - i.e. one that fixes the underlying and properly understood problem.
– Rags
Nov 7 at 13:15
Always nice to find the 'right' solution - i.e. one that fixes the underlying and properly understood problem.
– Rags
Nov 7 at 13:15
add a comment |
3 Answers
3
active
oldest
votes
up vote
2
down vote
An alternative solution that might be worth looking into: (This assumes you are on Linux or some other Unix variant)
Before processing each image, fork the process into two, one parent and one child process (which will otherwise be identical, look at the man page for fork(2)). Let the child do the risky stuff that might crash while the parent waits for it to terminate. If the child crashes, the parent can detect this and is still in a good state, so it can move on to the next image. If the child succeeds, you will need a way to transfer the result from the child to the parent, perhaps by using a pipe to send data. By opening the pipe before the fork call, both processes can connect using the same pipe.
As has already been suggested, fixing the crashes is probably the best solution, but sometimes that is not possible and you have to get "creative" instead.
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
add a comment |
up vote
1
down vote
Edited: SIGSEGV can't be caught as an exception with a try-catch block.
This page : Catch SIGSEV addresses the question.
4
SIGSEGV is not an exception, it's a signal.try
/catch
won't help.
– Quentin
Nov 7 at 9:29
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
add a comment |
up vote
0
down vote
You never should "Ignore SIGSEGV and continue execution" at all.
If your program writes per accident to some unknown memory address, the result is undefined. If your hardware detects the access to a unallowed memory region, you have luck! The bad case is that you access memory without getting a segfault. But after the access your memory is corrupted. So you can not rely on your code and the execution.
I believe the only thing you can do: Write correct code! This means: Check out of bounds access, maybe simply use containers from STL and use checked access like std::vector::at
.
Accepting that a program can write to every memory location is not a solution because a segfault is not the guaranteed result.
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
An alternative solution that might be worth looking into: (This assumes you are on Linux or some other Unix variant)
Before processing each image, fork the process into two, one parent and one child process (which will otherwise be identical, look at the man page for fork(2)). Let the child do the risky stuff that might crash while the parent waits for it to terminate. If the child crashes, the parent can detect this and is still in a good state, so it can move on to the next image. If the child succeeds, you will need a way to transfer the result from the child to the parent, perhaps by using a pipe to send data. By opening the pipe before the fork call, both processes can connect using the same pipe.
As has already been suggested, fixing the crashes is probably the best solution, but sometimes that is not possible and you have to get "creative" instead.
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
add a comment |
up vote
2
down vote
An alternative solution that might be worth looking into: (This assumes you are on Linux or some other Unix variant)
Before processing each image, fork the process into two, one parent and one child process (which will otherwise be identical, look at the man page for fork(2)). Let the child do the risky stuff that might crash while the parent waits for it to terminate. If the child crashes, the parent can detect this and is still in a good state, so it can move on to the next image. If the child succeeds, you will need a way to transfer the result from the child to the parent, perhaps by using a pipe to send data. By opening the pipe before the fork call, both processes can connect using the same pipe.
As has already been suggested, fixing the crashes is probably the best solution, but sometimes that is not possible and you have to get "creative" instead.
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
add a comment |
up vote
2
down vote
up vote
2
down vote
An alternative solution that might be worth looking into: (This assumes you are on Linux or some other Unix variant)
Before processing each image, fork the process into two, one parent and one child process (which will otherwise be identical, look at the man page for fork(2)). Let the child do the risky stuff that might crash while the parent waits for it to terminate. If the child crashes, the parent can detect this and is still in a good state, so it can move on to the next image. If the child succeeds, you will need a way to transfer the result from the child to the parent, perhaps by using a pipe to send data. By opening the pipe before the fork call, both processes can connect using the same pipe.
As has already been suggested, fixing the crashes is probably the best solution, but sometimes that is not possible and you have to get "creative" instead.
An alternative solution that might be worth looking into: (This assumes you are on Linux or some other Unix variant)
Before processing each image, fork the process into two, one parent and one child process (which will otherwise be identical, look at the man page for fork(2)). Let the child do the risky stuff that might crash while the parent waits for it to terminate. If the child crashes, the parent can detect this and is still in a good state, so it can move on to the next image. If the child succeeds, you will need a way to transfer the result from the child to the parent, perhaps by using a pipe to send data. By opening the pipe before the fork call, both processes can connect using the same pipe.
As has already been suggested, fixing the crashes is probably the best solution, but sometimes that is not possible and you have to get "creative" instead.
answered Nov 7 at 11:39
Johnny Johansson
1956
1956
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
add a comment |
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
That is a very bad idea! A segfault is the lucky result, if you write "somewhere" into the memory. If your wrong memory access is going to a memory address which is allowed but not intended, everything can happen. In fact the code is broken by design. "Risky" means "running wrong code" and accept "everything can happen" is not a solution at all!
– Klaus
Nov 7 at 11:56
add a comment |
up vote
1
down vote
Edited: SIGSEGV can't be caught as an exception with a try-catch block.
This page : Catch SIGSEV addresses the question.
4
SIGSEGV is not an exception, it's a signal.try
/catch
won't help.
– Quentin
Nov 7 at 9:29
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
add a comment |
up vote
1
down vote
Edited: SIGSEGV can't be caught as an exception with a try-catch block.
This page : Catch SIGSEV addresses the question.
4
SIGSEGV is not an exception, it's a signal.try
/catch
won't help.
– Quentin
Nov 7 at 9:29
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
add a comment |
up vote
1
down vote
up vote
1
down vote
Edited: SIGSEGV can't be caught as an exception with a try-catch block.
This page : Catch SIGSEV addresses the question.
Edited: SIGSEGV can't be caught as an exception with a try-catch block.
This page : Catch SIGSEV addresses the question.
edited Nov 7 at 9:33
answered Nov 7 at 9:28
Rags
30617
30617
4
SIGSEGV is not an exception, it's a signal.try
/catch
won't help.
– Quentin
Nov 7 at 9:29
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
add a comment |
4
SIGSEGV is not an exception, it's a signal.try
/catch
won't help.
– Quentin
Nov 7 at 9:29
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
4
4
SIGSEGV is not an exception, it's a signal.
try
/catch
won't help.– Quentin
Nov 7 at 9:29
SIGSEGV is not an exception, it's a signal.
try
/catch
won't help.– Quentin
Nov 7 at 9:29
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Already tried try-catch yes. Didn't work
– eirikaso
Nov 7 at 9:30
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
Fair point - been a while since I used Linux. Will consider.
– Rags
Nov 7 at 9:31
add a comment |
up vote
0
down vote
You never should "Ignore SIGSEGV and continue execution" at all.
If your program writes per accident to some unknown memory address, the result is undefined. If your hardware detects the access to a unallowed memory region, you have luck! The bad case is that you access memory without getting a segfault. But after the access your memory is corrupted. So you can not rely on your code and the execution.
I believe the only thing you can do: Write correct code! This means: Check out of bounds access, maybe simply use containers from STL and use checked access like std::vector::at
.
Accepting that a program can write to every memory location is not a solution because a segfault is not the guaranteed result.
add a comment |
up vote
0
down vote
You never should "Ignore SIGSEGV and continue execution" at all.
If your program writes per accident to some unknown memory address, the result is undefined. If your hardware detects the access to a unallowed memory region, you have luck! The bad case is that you access memory without getting a segfault. But after the access your memory is corrupted. So you can not rely on your code and the execution.
I believe the only thing you can do: Write correct code! This means: Check out of bounds access, maybe simply use containers from STL and use checked access like std::vector::at
.
Accepting that a program can write to every memory location is not a solution because a segfault is not the guaranteed result.
add a comment |
up vote
0
down vote
up vote
0
down vote
You never should "Ignore SIGSEGV and continue execution" at all.
If your program writes per accident to some unknown memory address, the result is undefined. If your hardware detects the access to a unallowed memory region, you have luck! The bad case is that you access memory without getting a segfault. But after the access your memory is corrupted. So you can not rely on your code and the execution.
I believe the only thing you can do: Write correct code! This means: Check out of bounds access, maybe simply use containers from STL and use checked access like std::vector::at
.
Accepting that a program can write to every memory location is not a solution because a segfault is not the guaranteed result.
You never should "Ignore SIGSEGV and continue execution" at all.
If your program writes per accident to some unknown memory address, the result is undefined. If your hardware detects the access to a unallowed memory region, you have luck! The bad case is that you access memory without getting a segfault. But after the access your memory is corrupted. So you can not rely on your code and the execution.
I believe the only thing you can do: Write correct code! This means: Check out of bounds access, maybe simply use containers from STL and use checked access like std::vector::at
.
Accepting that a program can write to every memory location is not a solution because a segfault is not the guaranteed result.
answered Nov 7 at 12:02
Klaus
10.3k12557
10.3k12557
add a comment |
add a comment |
2
You shouldn't catch
SIGSEGV
. You should prevent it. If you have out of bounds array access, then check array size before you access it. Check fornull
as well.– Yksisarvinen
Nov 7 at 9:37
1
Suggestions to cope with a segfault notwithstanding I must second @Yksisarvinen: The segfault probably comes because you blindly accept data from the files without checking it. Properly vetting the data for plausibility and specfication and implementation limits will (1) Probably allow you to tolerate some file corruption and still extract some image or meta data, and (2) make your program more secure. The last one is more important if you run it on third-party sources or even distribute it: Because maliciously crafted files could actually attack your computer.
– Peter A. Schneider
Nov 7 at 12:37
1
OK guys. Followed your advice and checked for columns and rows in the input images before trying to extract metadata from them. That did the trick
– eirikaso
Nov 7 at 12:42
Always nice to find the 'right' solution - i.e. one that fixes the underlying and properly understood problem.
– Rags
Nov 7 at 13:15