Da man gets
:se uno si lamenta di gets(), perché non fare lo stesso con scanf ("% s", ...)?
Non utilizzare mai gets(). Perché è impossibile dire senza conoscere i dati in anticipo quanti caratteri gets() leggerà, e perché gets() continuerà a memorizzare caratteri oltre la fine del buffer, è estremamente pericoloso usare . È stato utilizzato per interrompere la sicurezza del computer . Usa invece fgets().
Quasi ovunque vedo scanf
in uso in un modo che dovrebbe avere lo stesso problema (buffer overflow/buffer overrun): scanf("%s",string)
. Questo problema esiste in questo caso? Perché non ci sono riferimenti a riguardo nella pagina man scanf
? Perché gcc non avvisa quando si compila questo con -Wall
?
ps: so che c'è un modo per specificare nella stringa di formato la lunghezza massima della stringa con scanf
:
char str[10];
scanf("%9s",str);
edit: io non chiedo di Determe se il codice precedente è giusto o non. La mia domanda è: se scanf("%s",string)
è sempre sbagliato, perché non ci sono avvisi e non c'è nulla al riguardo nella pagina man?
Il tuo link wikipedia dice 'scanf' è * non sicuro *. – aviraldg
@aviraldg Hai ragione e l'ho letto prima, ma non stavo trovando un bel modo per scrivere il titolo. L'ho modificato – dbarbosa
Come tutti hanno risposto: 'scanf ("% s ", ...)' non è sicuro. Un altro riferimento a questo proposito: http://c-faq.com/stdio/scanfprobs.html. Ancora non capisco come non ci sia nulla in questa pagina man. – dbarbosa