【发布时间】:2017-01-09 12:08:05
【问题描述】:
当我使用Address Sanitizer(clang v3.4)来检测内存泄漏时,我发现使用-O(except -O0)选项总是会导致一个no-leak-detected结果。
代码很简单:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int* array = (int *)malloc(sizeof(int) * 100);
for (int i = 0; i < 100; i++) //Initialize
array[i] = 0;
return 0;
}
当使用 -O0 编译时,
clang -fsanitize=address -g -O0 main.cpp
它会正确检测内存,
==2978==WARNING: Trying to symbolize code, but external symbolizer is not initialized!
=================================================================
==2978==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 400 byte(s) in 1 object(s) allocated from:
#0 0x4652f9 (/home/mrkikokiko/sdk/MemoryCheck/a.out+0x4652f9)
#1 0x47b612 (/home/mrkikokiko/sdk/MemoryCheck/a.out+0x47b612)
#2 0x7fce3603af44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44)
SUMMARY: AddressSanitizer: 400 byte(s) leaked in 1 allocation(s).
但是,当 -O 添加时,
clang -fsanitize=address -g -O main.cpp
没有检测到!我在官方文档中没有找到任何关于它的内容。
【问题讨论】:
-
您的代码是 C 代码,而不是 C++ 代码。 C++标签错误,应该使用C标签。
-
你没有使用数组,也许它被优化了?
-
@BasileStarynkevitch 见
clang -fsanitize=address -g -O main.cpp行——这表明OP 正在使用C++(clang 编译器根据文件扩展名.cpp选择语言)。 OP 的代码是有效的 C++。
标签: c++ c memory-leaks address-sanitizer