В настоящее время я имею дело с проектом, использующим lodepng. Однако при попытке декодировать файлы PNG в пиксели возникает таинственный сбой сегмента.
Согласно информации, которую я получил с помощью GDB:
Program received signal SIGSEGV, Segmentation fault.
0x000055555555fd05 in lodepng_inspect (w=0x0, h=0x4, state=0x7fffffffd8b8, in=0x7ffff7eac010 "\211PNG\r\n\032\n", insize=993556)
at util/lodepng/lodepng.cpp:3937
3937 *w = lodepng_read32bitInt(&in[16]);
Затем я читаю код на lodepng.cpp: 3937 и поэтому воспроизвел это явление с помощью короткой программы на С ++:
#include<iostream>
#include"lodepng.cpp"
using namespace std;
int main(){
const unsigned char c[] = {0x12,0x34,0x56,0x78};
unsigned *w=NULL;
*w=lodepng_read32bitInt(c);
cout << *w << endl;
return 0;
}
Как lodepng_read32bitInt
(найти источник Вот) не указано в заголовочном файле, я должен включить файл cpp.
Запустив его, я получил похожую ошибку в GDB:
Program received signal SIGSEGV, Segmentation fault.
0x00005555555688bd in main () at poc.cc:9
9 *w=lodepng_read32bitInt(c);
Так у кого-нибудь есть идеи, чтобы решить эту проблему?
В следующих:
unsigned *w=NULL;
*w=lodepng_read32bitInt(c);
Вы пытаетесь присвоить значение тому, на что указывает нулевой указатель, это беззнаковое значение, просто сделайте так, чтобы ваш тип переменной вместо того, чтобы указатель был указателем. всегда
unsigned w =lodepng_read32bitInt(c);going to fail in user-mode code. If the function
возвращает
Как lodepng_read32bitInt
возвращается unsigned
Измените код на
unsigned w = lodepng_read32bitInt(c);
cout << w << endl;
РЕДАКТИРОВАТЬ Код по ссылке
unsigned lodepng_read32bitInt(const unsigned char* buffer)
{
return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]);
}