2017-04-21 2 views
1

Betrachten Sie den folgenden Code. Es wird kein Fehler angezeigt, wenn ich es kompiliere und mit dem Adressdesinfizierer austrage. Aber es sollte einen Fehler geben, d. H. Zuweisen/Zugreifen auf den Speicherbereich außerhalb der Grenzen? Warum spricht Desinfektionsmittel nicht an?Falsch negativ mit Adress-Desinfektionsmittel?

int arr[30]; 

int main(){ 
    arr[40] = 34; 
    printf(“%d”, arr[40]); 
} 

Vielen Dank!

clang -fsanitize=address -fno-omit-frame-pointer test.c 
./a.out 

Antwort

2

Dies wird durch den folgenden Eintrag in FAQ beschrieben:

Q: Why didn't ASan report an obviously invalid memory access in my code? 

A1: If your errors is too obvious, compiler might have already optimized it 
    out by the time Asan runs. 

A2: Another, C-only option is accesses to global common symbols which are 
    not protected by Asan (you can use -fno-common to disable generation of 
    common symbols and hopefully detect more bugs). 
+0

Aber selbst wenn ich int arr [30] lokal, statt global machen, es keinen Fehler werfen. Selbst die Verwendung von -fno-common wirft keinen Fehler auf. –

+0

Sicher, darum geht es bei A1. Im Grunde ist das GCC-Frontend "clever" genug, um offensichtlich schlechten Zugang früh wegzuwerfen, bevor ASan eine Chance hat einzugreifen. – yugr