2017-04-21 4 views
1

Considérons le code ci-dessous. Aucune erreur ne s'affiche lorsque je compile et que je l'exécute avec le désinfectant d'adresse. Mais il devrait y avoir une erreur juste en assignant/accédant à l'emplacement de mémoire hors limites? Pourquoi le désinfectant ne le détecte-t-il pas?Faux négatif avec l'adresse aseptiseur?

int arr[30]; 

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

Merci!

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

Répondre

2

Ceci est décrit par l'entrée suivante dans FAQ:

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

Mais même si je fais int arr [30] local, au lieu de global, il ne jette pas une erreur. Même en utilisant -fno-common ne génère pas d'erreur. –

+0

Bien sûr, c'est la réponse A1. Fondamentalement, l'interface GCC est assez "astucieuse" pour jeter l'accès de mauvaise qualité à un stade précoce, avant qu'ASan ait une chance d'intervenir. – yugr