出于实验目的,我想禁用glibc的 * 所有 * 堆损坏检查,特别是,我想禁用_int_free
函数中的这个检查:
/* Check that the top of the bin is not the record we are going to
add (i.e., double free). */
if (__builtin_expect (old == p, 0))
malloc_printerr ("double free or corruption (fasttop)");
并在unlink_chunk
函数中执行以下检查:
unlink_chunk()
[...]
if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
malloc_printerr ("corrupted double-linked list");
根据这个答案,MALLOC_CHECK_=0
禁用了运行时检查,但是,当我运行MALLOC_CHECK_=0 ./broken_program
时,我仍然得到错误消息:
MALLOC_CHECK_=0 ./broken_program
double free or corruption (out)
有什么可能性可以在不重新编译glibc的情况下禁用这个断开保护?
1条答案
按热度按时间c3frrgcw1#
根据此答案,MALLOC_CHECK_= 0禁用运行时检查。
这个答案已经过时了。它所描述的环境变量,你正在尝试使用的,在任何最新版本的Glibc中都没有文档。
有什么可能性可以在不重新编译glibc的情况下禁用这个断开保护?
据我所知,除了完全避免使用glibc的分配器之外,没有其他方法。请特别注意the online documentation of Glibc's allocator的"检测堆损坏"一节中的注解:
常见形式的损坏通过调用
malloc_printerr
来处理;这些检查始终包含在代码中。进一步的检查使用assert
,因此通过使用-DNDEBUG
构建glibc来禁用。在当前的glibc中,这两种检查都通过调用__libc_messsage
(最终调用abort
)来终止进程。非常旧版本的glibc支持在当前[sic]**堆损坏的情况下继续运行,但对这一点的支持已被取消。(着重号后加。)
注意,你不仅需要构建自己的glibc,还需要 * hack * glibc来删除检查或者在检测到损坏时抑制操作,没有glibc配置选项可以实现这一目的。