gpt4 book ai didi

c - 除了调用 free() 之外,有没有办法确定指针是否可以传递给 free()?

转载 作者:行者123 更新时间:2023-12-02 01:52:25 39 4
gpt4 key购买 nike

首先,介绍一下背景知识,这样您就不会认为我在尝试做一些疯狂的事情:

我正在尝试调试由其他人编写的 C 库中的崩溃。崩溃看起来像这样:

TheProgram(44365,0x7fff75996310) malloc: *** error for object 0x7fb8d4b9d440: pointer being freed was not allocated

崩溃发生在我无法运行 valgrind 的系统上,唉。我做的第一件事是将 debug-print-macros 包装在库对 malloc()、calloc()、realloc() 和 free() 的所有调用周围,以便在分配/重新分配内存时看到 printf() 输出/被图书馆释放。从该调试输出来看,似乎使 free() 崩溃的指针确实是先前在程序中分配的,并且在问题 free() 调用之前没有被释放:

JJ_CHECK_MALLOC at [fastgr.c : 265] malloc() returned 0x7fb8d4b9d440
[...]
JJ_CHECK_FREE at [dotinit.c : 204] about to call free(0x7fb8d4b9d440)
TheProgram(44365,0x7fff75996310) malloc: *** error for object 0x7fb8d4b9d440: pointer being freed was not allocated

所以大概必须发生的事情是在调用 malloc() 之后和调用 free() 之前的某处,堆必须以 free() 不再认为该指针有效的方式被破坏.

然后,我需要做的是追踪导致堆损坏的例程。我可以这样做的一种方法是在执行路径的各个位置查询指针的有效性,并缩小其状态从“有效堆指针”变为“堆管理器不知道该指针是什么”的位置。但是我所知道的唯一可以查明堆管理器是否认为指针是可释放的方法是调用 free(),当程序仍然想使用指针时我显然不能这样做。有没有什么方法可以调用 free() 使用的 check-if-pointer-is-in-heap 函数,而不实际释放数据?

最佳答案

一般来说:没有。

“调试堆”围绕分配的 block 提供额外的“栅栏”信息,以帮助检测坏指针错误。如果你试图释放不是通过它们分配的东西,它们会相当可靠地提示,因为栅栏会丢失。 (当然,如果您覆盖了缓冲区的末尾并损坏了栅栏,他们也会提示。)在代码经常更改的环境中,尽管性能成本很高,但我有时会在永久启用这些堆的情况下运行……但是人们希望在代码交付给客户之前通常可以将它们关闭。

关于c - 除了调用 free() 之外,有没有办法确定指针是否可以传递给 free()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21963425/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com