ASAN不会报告glib的GPtrArray相关功能的内存泄漏

时间:2019-12-23 03:32:07

标签: clang glib address-sanitizer

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

$ 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

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

1 个答案:

答案 0 :(得分:0)

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

通常,像您描述的那样的问题发生在LSan扫描开始时,main帧(在您的情况下为gparray)的陈旧内容不被覆盖时。

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