選項檢測內存泄漏當我使用Address Sanitizer(clang v3.4)檢測內存泄漏時,我發現使用-O(-O0除外)選項總是會導致無泄漏 - 檢測結果。地址Sanitizer無法使用-O
的代碼很簡單:
#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++。 –