Questo è davvero un buffer overflow?
-
23-08-2019 - |
Domanda
Lo strumento di analisi statica usiamo langue codice C analogo di seguito come un buffer overflow critico.
#define size 64
char buf [size + 1] = "";
memset (buf, 0, size + 1);
messaggio di errore dello strumento è: di overflow del buffer (Array Indice Out of Bounds):. L'array 'buf' dimensione è 1. Array 'buf' può utilizzare l'indice 0..64
E 'questo legittimo? Fa l'assegnazione della matrice di caratteri alla stringa vuota realmente provocare la sua lunghezza sia ridotta ad un singolo byte, come se fosse definito come char buf [] = "";
?
Soluzione
L'assegnazione di "" per buf [size + 1] non azzera la dimensione della BUF, ma è inutile, perché è la duplicazione di una piccola parte di ciò che la successiva memset lo fa (e confonde il vostro strumento di analisi statica - si potrebbe voglio segnalare un bug contro di essa).
Altri suggerimenti
A parte il fatto che char buf [size + 1] non compila perché la dimensione è un valore runtime, supponendo che si potrebbe costruire BUF come matrice di dimensione 65, quindi memset (BUF, 0, 65) non sarebbe un troppo pieno.
Le probabilità sono il vostro strumento è confuso dai vostri problemi sintattici.
[Modifica: maggiori informazioni]
In base a commenti al mio post originale, suggerisco il seguente:
#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);
Credo che Rob Kennedy è corretta; lo strumento utilizza il valore di stringa vuota inizializzatore come dimensione dell'array anziché dichiarazione matrice statica.
Non è un buffer overflow.
Questo è probabilmente un modo più pulito per farlo. Certo ci vuole meno linee di codice.
#define size 64
char buf[size + 1] = {0};
E 'legale - il buffer è abbastanza grande. Lo strumento che avverte che size_t potrebbe essere più grande di int e cercando di usarlo come indicizzatore può portare a risultati imprevedibili.