glibc堆一致性检查

dim*_*mba 8 gcc glibc memory-corruption

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

Pat*_*ick 3

默认情况下,在不使用 malloc_check_ 或 mcheck() 的情况下,glibc 会执行一些不会损害性能的小检查,例如对同一内存块调用两次 free()。这就是为什么您会收到其中一些消息,但您不会获得 malloc 替代 api 提供的所有消息,您可以通过使用 MALLOC_CHECK_ 获得这些消息(它正在执行更多测试,但也消耗更多的 CPU 资源)。您可以通过触发错误并使用或不使用 malloc_check_ 进行测试来检查这一点。例如,对于一个简单的 double-free(),我会收到“double free 或损坏(顶部)”或“free():无效指针”错误,具体取决于我是否设置 MALLOC_CHECK_ 。

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

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