Comment utiliser l'attribut 'format' de GCC?
Voici un petit morceau de code:
#include <stdio.h>
#include <stdarg.h>
void MyPrintf(char const* format, va_list args);
void MyVariadicPrintf(char const* format, ...);
void MyPrintf(char const* format, va_list args)
{
vprintf(format, args);
}
void MyVariadicPrintf(char const* format, ...)
{
va_list args;
va_start(args, format);
MyPrintf(format, args);
va_end(args);
}
int main(int, char*)
{
MyVariadicPrintf("%s" /* missing 2nd argument */);
return 0;
}
Je compile avec GCC 4.0, running Xcode sur Mac OS X Leopard.
-Wformat et -Wmissing-format-attribut sont activés.
Ce code donne un avertissement sur la ligne 9 (appel à vprintf
), ce qui suggère que MyPrintf
pourrait utiliser le "format" de l'attribut:
fonction peut être candidat possible pour 'printf' attribut de format
Afin d'ajouter l'attribut de cette façon (je ne sais pas si c'est à droite):
void MyPrintf(char const* format, va_list args) __attribute__((format(printf, 1, 0)));
La précédente avertissement disparaît et le message d'avertissement s'affiche désormais sur la ligne 16 (appel à MyPrintf
), ce qui suggère que MyVariadicPrintf
pourrait utiliser le "format" de l'attribut.
J'ai donc ajouter l'attribut de cette façon (assez sûr que c'est bon cette fois):
void MyVariadicPrintf(char const* format, ...) __attribute__((format(printf, 1, 2)));
Et maintenant, je reçois l'avertissement prévu à la ligne 22 (appel à MyVariadicPrintf
):
trop peu d'arguments pour format
- Ai-je fait de ce droit?
- J'ai remarqué que sur
MyPrintf
déclaration, si je supprime l'attribut de la partie, je vais encore obtenir le voulait avertissement sur la ligne 22. J'ai aussi remarqué que dans cet attribut partie, la modification de l'indice de 1 à 2 ne donne pas d'avertissement ou d'erreur. Ce qui est bien et ce qui est le but de l'attribut sur cette fonction? - Si j'ai ajouter la fonction suivante
MyVariadicPrintfT
et de l'appeler (spécialisé avecchar
), je vais obtenir de l'avertissement, ce qui suggère d'utiliser le "format" de l'attribut sur cette fonction. Je pense que c'est impossible parce que leformat
argument dépend de la basé sur un modèle type. Suis-je le droit?template<typename Type> void MyVariadicPrintfT(Type const* format, ...) { va_list args; va_start(args, format); MyPrintf(format, args); va_end(args); }
La dernière gnu de documentation peut être trouvé à gnu.org.
Avertissement les Options sont en la section 3.8 (cherchez "-Wmissing-format-attribut").
Les Attributs des fonctions sont en l'article 6.30 (voir "format (archétype, chaîne d'index, d'abord à vérifier)").
Grâce.
source d'informationauteur Guillaume
Vous devez vous connecter pour publier un commentaire.
La documentation a la réponse dont vous avez besoin. En particulier:
format(printf, 1, 0)
). 1 parce que la chaîne de format est le paramètre 1, 0, car il n'y a pas variadic arguments à être vérifié.Prendre un coup d'oeil à la GCC docs sur gnu.org. Comme pour la dernière question, je suppose que
MyPrintf
n'est pas une fonction de modèle et la seule définition disponible prendchar const*
comme premier argument de sorte qu'il se sent en sécurité à faire de la suggestion.