如何让 LeakSanitizer 忽略程序泄漏的结尾

Eva*_*enn 7 c memory address-sanitizer

我想用 LeakSanitizer 来检测泄漏的内存,但是我使用的程序的样式之前并没有释放内存exit。这在我的经验中相当普遍。

我想检测这个泄漏:

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

并忽略此泄漏:

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

yug*_*ugr 6

您希望 LSan 仅报告无法访问的泄漏,即保证由程序泄漏的指针。问题是,默认情况下,LeakSanitizer 在程序结束时运行它的检查,通常是在全局 C++ dtor 完成并且它们的内容不再被认为是可访问的之后。所以当 LSan 最终运行时,它必须假设很多东西不再可达。要解决此问题,您可以添加

#include <lsan_interface.h>
...
#ifdef __SANITIZE_ADDRESS__
  __lsan_do_leak_check();
  __lsan_disable();
#endif
Run Code Online (Sandbox Code Playgroud)

在从 main 返回之前(受问题 719llvm 讨论的启发)。

PS:小心像你上面发布的那些非常简单的例子。GCC 经常会删除未使用的分配和分配,即使在-O0所以总是检查汇编器是否符合您的期望。