如何使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也会经常删除未使用的分配和分配,因此请始终检查汇编程序是否符合您的期望。