如何使LeakSanitizer忽略程序结束时的内存泄漏

7
我想使用LeakSanitizer来检测内存泄漏,但我正在使用的程序在exit之前不会释放内存。根据我的经验,这种情况相当普遍。
我想检测这个内存泄漏:
int main(int argc, char const *argv[])
{
    char *p = malloc(5);
    p = 0;
    return 0;
}

忽略这个泄漏:

int main(int argc, char const *argv[])
{
    char *p = malloc(5);
    return 0;
}

2
相关:https://github.com/google/sanitizers/issues/719 - user2371524
1个回答

8

您希望LSan仅报告不可达泄漏,即程序保证将泄漏的指针。问题在于,默认情况下LeakSanitizer在程序结束时运行其检查,通常在全局C++ dtors完成后,其内容不再被认为是可访问的。因此,当LSan最终运行时,它必须假定许多内容不再可达。为解决这个问题,您可以添加

#include <lsan_interface.h>
...
#ifdef __SANITIZE_ADDRESS__
  __lsan_do_leak_check();
  __lsan_disable();
#endif

在主函数返回之前(受Issue 719llvm discussion的启发),请注意极其简单的示例,如上面您发布的示例。GCC通常会在-O0时删除未使用的赋值和分配,因此始终检查汇编程序是否符合您的期望。


非常完美的答案,谢谢。可惜我在谷歌上没有找到那个邮件列表或者 Github。 - Evan Benn
@EvanBenn 没问题,libsanitizer的内部结构非常复杂,有很多不明显的注意事项。 - yugr
这对于调用exit()而不是从main()返回的程序,使用atexit()也有效吗? - aij
@aij 我认为是的,你只需要在调用 exit 之前显式地调用 LSan(如答案所示)。 - yugr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接