¿Cómo usar el 'formato' del atributo GCC?

Aquí hay un pequeño fragmento de código:

#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;
}

Lo estoy compilando con GCC 4.0, ejecutando Xcode en Mac OS X Leopard.
-Wformat y -Wmissing-format-attribute están habilitados.
Este código da una advertencia en la línea 9 (llame avprintf), sugiriendo queMyPrintf podría usar el atributo 'formato':

function podría ser posible candidato para el atributo de formato 'printf'

Así que agrego el atributo de esta manera (no estoy seguro si esto es correcto):

void MyPrintf(char const* format, va_list args) __attribute__((format(printf, 1, 0)));

La advertencia anterior desaparece y la misma advertencia ahora aparece en la línea 16 (llame aMyPrintf), sugiriendo queMyVariadicPrintf podría usar el atributo 'formato'.
Así que agrego el atributo de esta manera (bastante seguro de que esta vez es correcto):

void MyVariadicPrintf(char const* format, ...) __attribute__((format(printf, 1, 2)));

Y ahora recibo la advertencia esperada en la línea 22 (llame aMyVariadicPrintf):

muy pocos argumentos para el formato

¿Lo hice bien? Me di cuenta de que enMyPrintf declaración, si elimino la parte del atributo, aún obtendré la advertencia deseada en la línea 22. También noté que en esta parte del atributo, cambiar el índice de 1 a 2 no dará ninguna advertencia o error. ¿Cuál es el correcto y cuál es el objetivo del atributo en esta función?

Si agrego la siguiente funciónMyVariadicPrintfT y llámalo (especializado enchar), Recibiré la advertencia que sugiere utilizar el atributo 'formato' en esta función. Creo que es imposible porque laformatl argumento @ depende del tipo de plantilla. ¿Estoy en lo cierto?

template<typename Type>
void MyVariadicPrintfT(Type const* format, ...)
{
    va_list args;
    va_start(args, format);
    MyPrintf(format, args);
    va_end(args);
}

La última documentación de GNU se puede encontrar en gnu.org.
as opciones de advertencia están en sección 3.8 (busque "-Wmissing-format-attribute").
os atributos de @Function están en sección 6.30 (busque "formato (arquetipo, índice de cadena, primero en verificar)").

Gracias

Respuestas a la pregunta(4)

Su respuesta a la pregunta