L'affermazione, come lo mostri, non è vulnerabile a nulla. Tuttavia, fprintf()
è in effetti un interprete a pieno titolo: quello che prende come formato stringa non è solo una sequenza di caratteri; è un codice sorgente per una lingua specifica con direttive che iniziano con un segno '%'.
Quando usi la tua funzione fprintf()
in questo modo, prima o poi, alcuni sviluppatori diventeranno tutti generici e virtuosi e fanatici dell'internazionalizzazione, e insisteranno per riscriverli in questo modo:
/* in some .h file */
#define MSG_EN_42 "Some random string\n"
#if LANGUAGE_IS_ENGLISH
#define MSG_42 MSG_EN_42
#endif
/* in another .c file */
fprintf(stderr, MSG_42);
Poi, alcune settimane / mesi / anni dopo, un altro sviluppatore, con poca conoscenza di C ma notevole conoscenza di tedesco / Thaï / Klingon, cambierà il file .h in modo simile a questo:
/* in some .h file */
#define MSG_EN_42 "Some random string\n"
#define MSG_KG_42 "fs'k5 f%n59 #$dsai!\n"
#if LANGUAGE_IS_ENGLISH
#define MSG_42 MSG_EN_42
#endif
#if LANGUAGE_IS_KLINGON
#define MSG_42 MSG_KG_42
#endif
E poi ne segue la difficoltà.
(A proposito, non è un vero esempio Klingon, l'uso di parole Klingon sul lettore ignaro sarebbe un po 'rude, ma tu hai l'idea.)
Per annullare questi problemi , utilizza una stringa di formato quando è necessaria una stringa di formato. Questo porterebbe a:
fprintf(stderr, "%s", "Some random string\n");
o, come soluzione più semplice:
fputs("Some random string\n", stderr);