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

我想使用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 ++ dtors完成后,它们的内容不再被认为是可访问的。 因此,当LSan最终运行时,它必须假设许多东西不再可达。 要解决此问题,您可以添加

 #include  ... #ifdef __SANITIZE_ADDRESS__ __lsan_do_leak_check(); __lsan_disable(); #endif 

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

PS:请注意上面提到的非常简单的例子。 即使在-O0 ,GCC也会经常删除未使用的分配和分配,因此请始终检查汇编程序是否符合您的期望。

Interesting Posts