2014-07-14 9 views
6

Quale dei seguenti è sicuro per quanto riguarda l'overflow del buffer?overf campo larghezza stringa overflow

char buf[10] = {0}; 
scanf("%10s", buf); 

o

char buf[10] = {0}; 
scanf("%9s", buf); 

Da quello che ho letto io vado per la seconda (sizeof meno uno), ma la questione è molto sottile e ho visto il codice che suggerisce sia. Qualche volontario per citare lo standard?

+0

È possibile leggere lo standard C per una risposta autorevole, a differenza della lettura di pagine Web casuali. –

risposta

9

Le C standard stabilisce che:

Un elemento di input è definita come la più lunga sequenza di byte di ingresso (fino a qualsiasi larghezza massima del campo specificato, che può essere misurata in caratteri o byte dipende lo specificatore di conversione) che è una sottosequenza iniziale di una sequenza di corrispondenza.

Ovvero, la larghezza massima del campo rappresenta il numero di caratteri che possono essere presenti nell'input. Il valore zero aggiuntivo alla fine non fa parte dell'input e richiede uno spazio aggiuntivo.

Il GNU libc manual rende questo punto esplicito:

conversioni ingresso String memorizzare un carattere nullo per contrassegnare la fine dell'input; la larghezza massima del campo non include questo terminatore.

Quindi, l'unica versione sicura è scanf("%9s", buf).

+0

Grazie! Trovo che lo standard sia confuso, ho dovuto leggere la parte che hai citato molte volte finché non è stato chiaro ... – jimis

2
char buf[10] = {0}; 
scanf("%10s", buf); 

non sicuro. Devi prendere in considerazione la stringa null terminator.

char buf[10] = {0}; 
scanf("%9s", buf); 

è sicuro.