2010-02-08 12 views
13

scuse in anticipo se uso una terminologia scadente.Come ottenere avvisi di formattazione di stringa errata (C++)

Quando compilo un C++ app sotto gdb e l'uso printf() mi dà avvertimenti impressionanti relativi alla consistenza della stringa di formato e gli argomenti passati in

ad esempio, questo codice:.

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

genera un avviso del compilatore "troppo pochi argomenti per il formato", che è super-utile. fornirà anche avvertimenti sul tipo di stringa di formato rispetto al tipo di argomento. deve aver ispezionato la stringa di formato e confrontato con i tipi di argomenti forniti. - questa sorta di introspezione in fase di compilazione è qualcosa che può essere aggiunto al codice sorgente ordinario o è qualcosa che deve essere compilato in gcc stesso?

fwiw questo è in gcc 4.2.1 su os x.

risposta

9

Si può fare cose come questa per le proprie funzioni printf-simile (così come per scanf/strftime/strfmon-come funzioni):

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

Vedere la gcc manual per ulteriori dettagli.

+3

Ci sono un sacco di altre opzioni nel manuale; tuttavia non possono essere sufficienti per coprire il caso generale di tutte le funzioni variadiche. –

+2

eh; nifty. grazie Paolo dalla pagina di manuale: "L'attributo di formato specifica che una funzione accetta gli argomenti di stile printf, scanf, strftime o strfmon che dovrebbero essere controllati mediante una stringa di formato" così sembra che abbia i miei limiti nocciola (per esempio qualcosa di diverso dalla famiglia di funzioni printf) questo non farebbe davvero il trucco, ma c'è un sacco di altri __attributes__ interessanti nella pagina a cui sei collegato. Grazie ! –

+0

Fantastico. Qualcuno sa se il compilatore Intel C ha qualcosa di simile? Non ho trovato nulla nel manuale. – pavon

Problemi correlati