2016-01-15 36 views
7

Sto lavorando ad un programma scritto in C che di tanto in tanto costruisco con disinfettante di indirizzi, fondamentalmente per catturare bug. Il programma stampa un banner nei log quando viene avviato con informazioni come: chi lo ha creato, il ramo su cui è stato costruito, il compilatore ecc. Stavo pensando che sarebbe bello anche precisare se il binario è stato compilato usando l'indirizzo disinfettante . So che c'è __has_feature (address_sanitizer), ma funziona solo per clang. Ho provato il seguente programma semplice:Come rilevare se si costruisce con disinfettante indirizzi quando si costruisce con gcc 4.8?

#include <stdio.h> 

int main() 
{ 
#if defined(__has_feature) 
# if __has_feature(address_sanitizer) 
    printf ("We has ASAN!\n"); 
# else 
    printf ("We have has_feature, no ASAN!\n"); 
# endif 
#else 
    printf ("We got nothing!\n"); 
#endif 

    return 0; 
} 

Quando si costruisce con gcc -Wall -g -fsanitize=address -o asan asan.c, questo rendimenti:

We got nothing! 

Con clang -Wall -g -fsanitize=address -o asan asan.c ottengo:

We has ASAN! 

Esiste un equivalente gcc per __has_feature?

So che ci sono modi per controllare, come l'enorme valore VSZ per i programmi costruiti con disinfettante di indirizzi, solo chiedendo se c'è una definizione in fase di compilazione o qualcosa del genere.

+0

Sembra che ci sia un bug per questo: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60512 – dragosht

risposta