【发布时间】:2019-04-10 17:06:31
【问题描述】:
我有一个充满图像的文件夹,其中包含我试图用我的程序提取的像素中的一些元数据。程序循环遍历每个文件,提取数据。问题是某些图像已损坏,尝试从中提取数据会导致分割错误。
有什么方法可以捕捉到这个 SIGSEGV 信号并用它来忽略当前损坏的图像并继续下一个 noe?
try-catch 无济于事,因为这是一个信号,而不是例外。
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("done\n");
}
return 0;
}
【问题讨论】:
-
你不应该抓住
SIGSEGV。你应该防止它。如果您有超出范围的数组访问权限,请在访问之前检查数组大小。检查null。 -
尽管我必须第二次处理段错误的建议@Yksisarvinen:段错误可能是因为您盲目地接受文件中的数据而不检查它。正确审查数据的合理性、规范和实施限制将 (1) 可能允许您容忍一些文件损坏并仍然提取一些图像或元数据,以及 (2) 使您的程序更安全。如果您在第三方来源上运行它甚至分发它,最后一个更为重要:因为恶意制作的文件实际上可能会攻击您的计算机。
-
好的,伙计们。在尝试从中提取元数据之前,请遵循您的建议并检查输入图像中的列和行。成功了
-
总是很高兴找到“正确”的解决方案——即解决根本问题并得到正确理解的解决方案。
标签: c++