【发布时间】:2018-08-22 09:19:27
【问题描述】:
当我编译这个简单的测试程序时,我从地址清理程序中得到了明显的泄漏报告,但是当我编译相同的程序但有一个无限循环并打破它发出 SIGINT 时,我没有得到任何输出。
检查 asm 输出,malloc 没有被优化掉(如果可能的话)
这是地址清理程序的预期行为吗?我在其他开发中没有遇到这个问题。
工作示例:
#include <stdlib.h>
int main(void)
{
char *a = malloc(1024);
return 1;
}
不工作(用 SIGINT 杀死):
#include <stdlib.h>
int main(void)
{
char *a = malloc(1024);
for(;;);
return 1;
}
编译:gcc test.c -o test -fsanitize=address
我在一个完整的程序中遇到了这个问题,但我把它简化为这个最小的例子。
【问题讨论】:
-
实际上,这是预期的行为。原因是,否则你肯定会得到一堆误报:它们越多,你的应用程序就越大。一个例子为什么:假设在你的代码中,在循环之后你有一个
free(a)。所以从技术上讲,你的代码没有泄漏。但是,在对应用程序进行 SIGINT 时,您会收到无效的泄漏报告,因为在您终止应用程序时内存尚未释放。基本上,SIGINT/SIGTERM 意味着,除了您明确绑定到信号的那些之外,不会运行任何清理/析构函数。
标签: c address-sanitizer