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

  1. Ai-je fait de ce droit?
  2. 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?
  3. Si j'ai ajouter la fonction suivante MyVariadicPrintfT et de l'appeler (spécialisé avec char), 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 le format 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