如何让 LeakSanitizer 忽略程序泄漏的结尾
How do I make LeakSanitizer ignore end of program leaks
我想使用 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;
}
您希望 LSan 仅报告无法访问的泄漏,即保证会被程序泄漏的指针。问题是,默认情况下,LeakSanitizer 在程序结束时运行它的检查,通常是在全局 C++ dtor 完成并且它们的内容不再被认为可访问之后。因此,当 LSan 最终运行时,它必须假设很多东西不再可达。要解决此问题,您可以添加
#include <lsan_interface.h>
...
#ifdef __SANITIZE_ADDRESS__
__lsan_do_leak_check();
__lsan_disable();
#endif
从 main 返回之前(受 Issue 719 and llvm discussion 启发)。
PS:小心那些非常简单的例子,比如上面 post 的例子。即使在 -O0
,GCC 也会经常删除未使用的赋值和分配,因此请始终检查汇编器是否符合您的期望。
我想使用 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;
}
您希望 LSan 仅报告无法访问的泄漏,即保证会被程序泄漏的指针。问题是,默认情况下,LeakSanitizer 在程序结束时运行它的检查,通常是在全局 C++ dtor 完成并且它们的内容不再被认为可访问之后。因此,当 LSan 最终运行时,它必须假设很多东西不再可达。要解决此问题,您可以添加
#include <lsan_interface.h>
...
#ifdef __SANITIZE_ADDRESS__
__lsan_do_leak_check();
__lsan_disable();
#endif
从 main 返回之前(受 Issue 719 and llvm discussion 启发)。
PS:小心那些非常简单的例子,比如上面 post 的例子。即使在 -O0
,GCC 也会经常删除未使用的赋值和分配,因此请始终检查汇编器是否符合您的期望。