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

时间:2018-07-27 07:40:36

标签: c memory address-sanitizer

我想使用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;
}

1 个答案:

答案 0 :(得分:3)

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

E

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

PS:请谨慎使用非常简单的示例,例如您上面发布的示例。即使在<c-v>jj$S" ,GCC也会经常删除未使用的分配和分配,因此请始终检查汇编程序是否符合您的期望。