glibc堆一致性检查

时间:2010-05-14 07:11:02

标签: gcc glibc memory-corruption

  1. 根据2008年的帖子(我现在找不到),glibc heap check在多线程环境中不起作用。现在是2010年的情况吗?
  2. 默认情况下是否启用堆检查? (gcc 4.1.2)?我没有设置MALLOC_CHECK_,不知道调用mcheck(),但仍然有时会收到带有backtrace的双重自由glibc错误。也许它是由一些编译标志启用的?

1 个答案:

答案 0 :(得分:3)

默认情况下,不使用malloc_check_或mcheck(),glibc会做一些不会影响性能的小检查,比如在同一个内存块上调用两次free()。这就是为什么你得到这些消息的原因,但是你不会通过使用MALLOC_CHECK_获得malloc替代api提供的所有消息(它们正在进行更多的测试,但是更多的cpu密集)。您可以通过触发错误并使用malloc_check_和不使用malloc_check_对其进行测试来检查这一点。例如,对于一个简单的double-free(),无论何时设置MALLOC_CHECK_,我都会得到“double free或corruption(top)”或“free():invalid invalid”错误。

要回答1 /问题,mcheck依赖于malloc挂钩,因为它们存在(如15年),并且这些挂钩不是为了线程安全。

来源:glibc / malloc / malloc.c,http://sourceware.org/bugzilla/show_bug.cgi?id=9939