首页 > 解决方案 > ASAN 不报告 glib 的 GPtrArray 相关函数的内存泄漏

问题描述

我发现glib的相关功能ASAN没有报告内存泄漏。例如: GPtrArray

$ cat test_asan.c
#include <glib.h>
int main()
{
    GPtrArray *gparray = g_ptr_array_new_with_free_func(g_free);

    g_ptr_array_add(gparray, g_strdup("--"));
}

构建并运行这个文件:

$ clang -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -fsanitize=address -g test_asan.c -o test_asan -lglib-2.0
$ ./test_asan
$

没有任何报道。但实际上,上面的程序忘记g_ptr_array_free (gparray, TRUE);在函数结束时main调用。

任何人都可以对这种行为做出一些解释吗?还是我错过了什么?

标签: clangglibaddress-sanitizer

解决方案


LeakSanitizer 正在使用一种简单的算法来扫描堆栈帧、寄存器、全局和线程局部变量以及看起来像内存地址的数据的可访问堆分配。这种情况在没有编译器反馈的情况下发生,因此不相关、随机或陈旧的数据可能会导致丢失的内存被认为是可访问的。该算法因此是不精确的,并且已知会产生假阴性(参见例如herehere),这实际上取决于编译器/库版本和/或标志。

main通常,当 LSan 扫描开始时' 帧的陈旧内容(gparray在您的情况下)碰巧没有被覆盖时,就会发生类似您描述的问题。

由于这是一个设计问题,您无能为力。


推荐阅读