我在运行时的C程序上出错了。我发现了一些关于“双重免费或腐败”错误的内容,但没有任何相关性。
这是我的代码:
void compute_crc32(const char* filename, unsigned long * destination)
{
FILE* tmp_chunk = fopen(filename, "rb");
printf("\n\t\t\tCalculating CRC...");
fflush(stdout);
Crc32_ComputeFile(tmp_chunk, destination);
printf("\t[0x%08lX]", *destination);
fflush(stdout);
fclose(tmp_chunk);
printf("\t[ OK ]");
fflush(stdout);
}
似乎是
fclose(tmp_chunk);
引发了这个glibc错误:
*** glibc detected *** ./crc32: double free or corruption (out): 0x09ed86f0 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb763cee2]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb762c424]
./crc32[0x80498be]
./crc32[0x8049816]
./crc32[0x804919c]
./crc32[0x8049cc2]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75e04d3]
./crc32[0x8048961]
在控制台输出中,显示最后一个CRC,但不显示最后一个“[OK]”...
我从来没有遇到过这种类型的错误,我在谷歌搜索了几个小时,但在我的情况下没有什么真正有趣的......请帮忙:)。
现在我有另一个错误:
*** glibc detected *** ./xsplit: free(): invalid next size (normal): 0x095a66f0 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7647ee2]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb7637424]
./xsplit[0x80497f7]
./xsplit[0x804919c]
./xsplit[0x8049cd6]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75eb4d3]
./xsplit[0x8048961]
这到底是什么意思?我迷路了...... :(
答案 0 :(得分:2)
*** glibc detected *** ./crc32: double free or corruption
Glibc告诉你,你已经损坏了堆。
在Linux上查找此类损坏的工具是Valgrind和AddressSanitizer。
有可能,其中一个会立即告诉你你的问题是什么。