주소 소실 기 (clang v3.4)를 사용하여 메모리 누수를 감지 할 때 -O 옵션을 사용하면 항상 누수가 없음을 알았습니다 검출 된 결과. 그러나주소 Sanitizer가 -O 옵션을 사용하여 메모리 누수를 감지 할 수 없음
clang -fsanitize=address -g -O0 main.cpp
올바르게 메모리를 감지, -O 첨가,
==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).
#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 -O main.cpp
아무 것도 감지되지 않았습니다! 그리고 나는 공식 문서에서 그것에 대해 아무것도 발견하지 못합니다.
코드는 C 코드가 아닌 C++ 코드입니다. C++ 태그가 잘못되어 C 태그를 사용해야합니다. –
배열을 사용하고 있지 않습니다. 아마도 최적화 된 것입니까? –
@BasileStarynkevitch OP가 C++을 사용하고 있음을 나타내는'clang -fsanitize = address -g -O main.cpp' 라인을 봅니다 (clang 컴파일러는 파일 확장자'.cpp'를 기반으로 언어를 선택합니다). OP의 코드는 유효한 C++입니다. –