我在调用 png_write_info 时观察到由于 libpng (1.6.20) 中的访问冲突导致的崩溃。我已经从源代码(包括 zlib 1.2.8)构建了 libpng,并且 libpng 源代码附带的 png 测试全部通过,没有任何错误。我可以确认在这些测试期间正在创建好的 png 文件。
我的程序的简单分解(直到它崩溃)看起来像这样。为简单起见,我删除了所有错误和边界检查:
int main(int argc, char *argv[]) {
char* filename = argv[1];
png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info = png_create_info_struct(png);
if (setjmp(png_jmpbuf(png)))
{
abort();
}
// Output is 16-bit depth, greyscale format.
png_set_IHDR(
png,
info,
127, 127,
16,
PNG_COLOR_TYPE_GRAY,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT
);
// do the file stuff
FILE *fp;
errno_t error = fopen_s(&fp, filename, "wb");
png_init_io(png, fp);
png_write_info(png, info); // <-- crashes …Run Code Online (Sandbox Code Playgroud)