Buongiorno a tutti. La settimana scorsa in una discussione su questo forum (vedi
https://www.iprogrammatori.it/forum-programmazione/cplusplus/stampare-quadrato-qualunque-carattere-t33486.html) è emerso che per i Deitel è insicuro scrivere
printf( "Welcome to C!\n" );
In questo estratto
http://www.informit.com/articles/article.aspx?p=2062174&seqNum=6 i Deitel spiegano che in questo caso bisogna preferire la puts() o, se non si vuole andare a capo, quest'altra forma
printf( "%s", "Welcome " );
L'articolo fa riferimento a questa "regola" ; in pratica questa regola ci ricorda che non è "bello" usare come stringa di formato una stringa che è modificabile dall'utente (non solo in printf()).
A questo punto credo che la "regola" suggerita dai Deitel sia esagerata (oltre che non esaustiva); in fondo basterebbe imporsi di non richiamare mai printf() con una stringa di formato non costante, per evitare che venga modificata malintenzionatamente. Ovvero che sia da evitare in qualsiasi modo questa forma:
printf(str);
a favore di questa forma
printf("%s",str);
oppure
puts(str);
A conferma del mio pensiero ho provato con gcc che se si scrivo printf(str); ottengo il warning "format not a string literal and no format arguments [-Wformat-security] mentre se scrivo printf("Ciao") non mi segnala niente.
Naturalmente io non voglio (come potrei?) giudicare il lavoro dei Deitel, non ne ho le competenze, ma volevo capire cosa ne pensate voi del forum al riguardo, perchè magari la regola dei Deitel ha qualche fondamento che a me sfugge...