2010-02-08 4 views
13

excuses d'avance si j'utilise une mauvaise terminologie.Comment obtenir des avertissements de formatage de chaîne incorrect (C++)

quand je compilez un C++ application sous gdb et l'utilisation printf(), il me donne des avertissements impressionnants relatifs à la cohérence de la chaîne de format et les arguments transmis

par exemple, ce code.

printf("%s %s", "foo"); 

résulte dans un avertissement du compilateur "trop ​​peu d'arguments pour le format", ce qui est super utile. il donnera également des avertissements sur le type de chaîne de format par rapport au type d'argument. il doit avoir inspecté la chaîne de format et l'avoir comparée aux types d'arguments fournis. - Est-ce que ce genre d'introspection à la compilation peut être ajouté au code source ordinaire, ou est-ce quelque chose qui doit être compilé dans gcc lui-même?

fwiw c'est sous gcc 4.2.1 sur os x.

Répondre

9

Vous pouvez faire des choses comme ça pour vos propres fonctions printf-like (ainsi que pour scanf/strftime/fonctions strfmon-like):

#define PRINTF_FORMAT_CHECK(format_index, args_index) __attribute__ ((__format__(printf, format_index, args_index))) 

void my_printf(const char *fmt, ...) PRINTF_FORMAT_CHECK(1, 2); 

Voir la gcc manual pour plus de détails.

+3

Il y a beaucoup d'autres options dans le manuel; ils ne peuvent cependant pas suffire à couvrir le cas général de toutes les fonctions variadiques. –

+2

huh; chouette. merci Paul. "L'attribut format spécifie qu'une fonction prend des arguments de type printf, scanf, strftime ou strfmon qui doivent être vérifiés par type avec une chaîne de format" donc il semble que j'ai mes propres contraintes de noisette (par exemple, quelque chose d'autre que la famille de fonctions printf) cela ne ferait pas vraiment l'affaire, mais il y a tout un tas d'autres __attributs intéressants dans la page à laquelle vous avez un lien. Merci ! –

+0

Génial. Quelqu'un sait si le compilateur Intel C a quelque chose de similaire? Je n'ai rien trouvé dans le manuel. – pavon