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.
Sembra che ci sia un bug per questo: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60512 – dragosht