GlibC双重免费或腐败(fclose)

时间:2013-01-07 15:57:40

标签: free glibc corruption fclose

我在运行时的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]

这到底是什么意思?我迷路了...... :(

1 个答案:

答案 0 :(得分:2)

  

*** glibc detected *** ./crc32: double free or corruption

Glibc告诉你,你已经损坏了堆。

在Linux上查找此类损坏的工具是ValgrindAddressSanitizer

有可能,其中一个会立即告诉你你的问题是什么。