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

标签 c memory address-sanitizer

我想使用 LeakSanitizer 来检测泄漏的内存,但我使用的程序的样式不会在退出 之前释放内存。这在我的经验中相当普遍。

我想检测这个泄漏:

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;
}

最佳答案

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

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

在从 main 返回之前(受 Issue 719llvm discussion 启发)。

PS:请谨慎对待极其简单的示例,例如您在上面发布的示例。即使在 -O0 处,GCC 也会经常删除未使用的赋值和分配,因此请始终检查汇编器是否符合您的期望。

关于c - 如何让 LeakSanitizer 忽略程序泄漏的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51553115/

相关文章:

objective-c - 在代码中存储和引用第三方 API key 和常量列表的最佳方式?

c - 如何将任何 SDL_Surface 转换为 RGBA8888 格式并返回?

c++ - OS X 上有哪些动态库可以想当然?

csv - Clojure - 解析小型 CSV 文件的内存使用情况

java - 管理文件java上的大数组

c++ - 如何在 GCC 中使用 Container Overflow Bugs 检测?

c - 管道未清除 - 我每次都在读取相同的第一个字符

clang - 我应该默认使用三个相互排斥的 Clang sanitizer 中的哪一个?

c++ - UNIX sockets::recv、std::byte 和严格别名

c - 内存、缓冲区和堆栈有什么区别?