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 [] = "";?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top