Clang 阿桑没有';t报告glib'的内存泄漏;与GPtrArray相关的函数
我发现Clang 阿桑没有';t报告glib'的内存泄漏;与GPtrArray相关的函数,clang,glib,address-sanitizer,Clang,Glib,Address Sanitizer,我发现ASAN没有为的gptraray相关函数报告内存泄漏。例如: $ 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("--")); } 没有报告任何情况。但实际上,上面的程序忘记调用g_ptr_array_free(gparra
ASAN
没有为的gptraray
相关函数报告内存泄漏。例如:
$ 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("--"));
}
没有报告任何情况。但实际上,上面的程序忘记调用g_ptr_array_free(gparray,TRUE)代码>位于main
功能的末尾
谁能解释一下这种行为?或者我遗漏了什么?LeakSanitizer正在使用一种扫描堆栈帧、寄存器、全局和线程局部变量以及可访问堆分配的方法来扫描看起来像内存地址的数据。这种情况在没有编译器反馈的情况下发生,因此不相关、随机或陈旧的数据可能会导致内存丢失,被认为是可访问的。因此,该算法是不精确的,并且已知会产生假阴性(参见例如or),这实际上取决于编译器/库版本和/或标志
通常,当LSan扫描开始时,main
的帧(gparray
)的陈旧内容没有被覆盖时,就会出现您描述的问题
由于这是一个设计问题,您对此无能为力
$ 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
$