2017-03-24 4 views
0

Je compile mon code sur gcc 4.8.3. J'ai activé l'option -fsanitize=address. Mais mon programme se termine au démarrage en lançant une erreur globale de dépassement de tampon dans le code de la bibliothèque tierce. Donc, j'essaie d'ignorer le désinfectant pour cette fonction (ou la fonction de l'appelant). J'ai essayé __attribute__((no_sanitize("address"))) mais le compilateur lance l'avertissement que ‘no_sanitize’ attribute directive ignored a même essayé -fsanitize-recover=address mais la récupération ne semble pas être prise en charge sur l'adresse. Quelqu'un peut-il m'aider avec comment faire pour que mon programme continue après la première erreur, ou la fonction de liste noire pour sauter l'aseptisation?gcc (4.8.3) options de désinfection pour les fonctions de liste noire

EDIT

template <class T> 
void __attribute__((no_sanitize_address)) OID_CB<T>::Init(s8_t* name, s8_t* data, u32_t entryNum, u32_t start, u32_t end, u32_t entrySize, bool ViewFlag, bool WholeTableFlag) 
{ 
     strcpy(mName,name); 
     mName[strlen(name)]='\0'; 
     mData   = data; 
     mEntryNum  = entryNum; 
     mStart  = start; 
     mEnd   = end; 
     mEntrySize = entrySize; 
     mIsView  = ViewFlag; 
     mIsWholeTable = WholeTableFlag; 
} 


==22247== ERROR: AddressSanitizer: global-buffer-overflow on address 0x000002ca57bf at pc 0x1020cc2 bp 0x7ffdd93b7070 sp 0x7ffdd93b7060 
READ of size 1 at 0x000002ca57bf thread T0 
    #0 0x1020cc1 in OID_CB<causeCodeMgr>::Init(char*, char*, unsigned int, unsigned int, unsigned int, unsigned int, bool, bool) /xxxx/xxxx/common/causeCodeMgr/../../../xxx/oam/include/cm_interface.h:457 
    #1 0x1020cc1 in CMI<causeCodeMgr>::addOID(char*, unsigned long long, char*, unsigned int, unsigned int, unsigned int, unsigned int, bool, bool) /xxxx/xxx/common/causeCodeMgr/../../../xxx/oam/include/cm_interface.h:1289 

    0x000002ca57bf is located 45 bytes to the right of global variable '*.LC670 (causeCodeMgr.cpp)' (0x2ca5780) of size 18 
    '*.LC670 (causeCodeMgr.cpp)' is ascii string 'causeCodeInternal' 
0x000002ca57bf is located 1 bytes to the left of global variable '*.LC671 (causeCodeMgr.cpp)' (0x2ca57c0) of size 26 
    '*.LC671 (causeCodeMgr.cpp)' is ascii string 'internalCauseCodeToAction' 
SUMMARY: AddressSanitizer: global-buffer-overflow /xxxx/rhel_7_1_x86_64/xxxx/common/causeCodeMgr/../../../xxxx/oam/include/cm_interface.h:457 OID_CB<causeCodeMgr>::Init(char*, char*, unsigned int, unsigned int, unsigned int, unsigned int, bool, bool) 
Shadow bytes around the buggy address: 
    0x00008058caa0: f9 f9 f9 f9 00 07 f9 f9 f9 f9 f9 f9 00 06 f9 f9 
    0x00008058cab0: f9 f9 f9 f9 00 03 f9 f9 f9 f9 f9 f9 00 04 f9 f9 
    0x00008058cac0: f9 f9 f9 f9 00 00 02 f9 f9 f9 f9 f9 00 00 06 f9 
    0x00008058cad0: f9 f9 f9 f9 00 00 00 00 02 f9 f9 f9 f9 f9 f9 f9 
    0x00008058cae0: 00 00 06 f9 f9 f9 f9 f9 00 00 f9 f9 f9 f9 f9 f9 
=>0x00008058caf0: 00 00 02 f9 f9 f9 f9[f9]00 00 00 02 f9 f9 f9 f9 
    0x00008058cb00: 00 00 00 f9 f9 f9 f9 f9 00 07 f9 f9 f9 f9 f9 f9 
    0x00008058cb10: 00 00 00 f9 f9 f9 f9 f9 00 04 f9 f9 f9 f9 f9 f9 
    0x00008058cb20: 00 03 f9 f9 f9 f9 f9 f9 00 07 f9 f9 f9 f9 f9 f9 
    0x00008058cb30: 00 00 02 f9 f9 f9 f9 f9 00 07 f9 f9 f9 f9 f9 f9 
    0x00008058cb40: 00 04 f9 f9 f9 f9 f9 f9 00 01 f9 f9 f9 f9 f9 f9 
Shadow byte legend (one shadow byte represents 8 application bytes): 
    Addressable:   00 
    Partially addressable: 01 02 03 04 05 06 07 
    Heap left redzone:  fa 
    Heap righ redzone:  fb 
    Freed Heap region:  fd 
    Stack left redzone: f1 
    Stack mid redzone:  f2 
    Stack right redzone: f3 
    Stack partial redzone: f4 
    Stack after return: f5 
    Stack use after scope: f8 
    Global redzone:  f9 
    Global init order:  f6 
    Poisoned by user:  f7 
    ASan internal:   fe 

Répondre

0

J'ai essayé attribut ((no_sanitize ("adresse"))) mais le compilateur jette avertissement que 'no_sanitize' attribut de directive

I J'ai peur que GCC ne supporte pas cette syntaxe (il y a même a bug in their Bugzilla). Vous devriez être capable d'utiliser no_sanitize_address cependant (lisez à ce sujet dans docs).

même essayé -fsanitize-recover = adresse mais la récupération ne semble pas être pris en charge sur l'adresse.

Cela ne est apparu dans GCC 6.

+0

Oui, comme vous le suggérez no_sanitize_address a travaillé pour le programme de test avec la fonction normale. Mais n'a pas pris effet pour la fonction de membre de modèle. Je n'ai pas trouvé d'exemple pour les fonctions de template – Nasir

+0

@Nasir Je vous suggère de poster un exemple minimal qui illustre votre problème. Cela peut ou peut ne pas être un bug du compilateur. – yugr

+0

J'ai manqué de compiler une bibliothèque avec l'attribut activé. @yugr votre réponse a résolu mon problème pour le moment. – Nasir