我发现ASAN
没有报告glib的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
。
任何人都可以对此行为做出一些解释吗?还是我错过了什么?
答案 0 :(得分:0)
LeakSanitizer正在使用simple algorithm来扫描堆栈帧,寄存器,全局和线程局部变量以及可访问的堆分配,以查找看起来像内存地址的数据。这种情况在没有编译器反馈的情况下发生,因此无关的,随机的或过时的数据可能会导致丢失的内存被认为是可以到达的。因此,该算法是不精确的,并且已知会产生假阴性(例如参见here或here),这实际上取决于编译器/库的版本和/或标志。
通常,像您描述的那样的问题发生在LSan扫描开始时,main
帧(在您的情况下为gparray
)的陈旧内容不被覆盖时。
由于这是一个设计问题,因此您无能为力。