erkennen Wenn ich Address Sanitizer (clang v3.4) zur Erkennung von Speicherlecks verwende, habe ich festgestellt, dass die Option -O (außer -O0) immer zu einem Leck führen würde -erfasstes ErgebnisAdresse Sanitizer kann Speicherverluste nicht mit der Option -O
Der Code ist einfach:
#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;
}
wenn kompilieren mit -O0,
clang -fsanitize=address -g -O0 main.cpp
es richtig Speicher erkennt,
==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).
jedoch, wenn -O hinzugefügt,
clang -fsanitize=address -g -O main.cpp
nichts wird erkannt! Und ich finde nichts davon im offiziellen Dokument.
Ihr Code ist Code C, nicht C++ Code. Das C++ - Tag ist falsch und ein C-Tag sollte verwendet werden. –
Sie verwenden kein Array, vielleicht wird es optimiert? –
@BasileStarynkevitch siehe die Zeile 'clang -fsanitize = Adresse -g -O main.cpp' - das zeigt an, dass OP C++ benutzt (der Clan-Compiler wählt die Sprache basierend auf der Dateiendung' .cpp'). OP-Code ist gültig C++. –