C6029
avviso C6029: possibile sovraccarico del buffer nella chiamata a <funzione>: utilizzo del valore non verificato
Questo avviso indica che a una funzione che accetta un buffer e una dimensione viene passata una dimensione non verificata. I dati letti da qualche origine esterna non sono stati verificati per vedere se sono di dimensioni inferiori a quella del buffer. Un aggressore potrebbe specificare un valore molto maggiore di quello previsto per la dimensione, determinando un sovraccarico del buffer.
In generale, quando si leggono i dati da un'origine esterna non affidabile, è consigliabile accertarsi di verificarne la validità. Di solito è consigliabile verificare le dimensioni per accertarsi che si trovino nell'intervallo previsto.
Esempio
Nel codice seguente l'avviso viene generato chiamando due volte la funzione annotata ReadFile. Dopo la prima chiamata, la proprietà dell'attributo Post contrassegna il valore del secondo parametro come non affidabile. Pertanto, passando un valore non affidabile nella seconda chiamata a ReadFile viene generato questo avviso come visualizzato nel codice seguente:
#include "windows.h"
bool f(HANDLE hFile)
{
char buff[MAX_PATH];
DWORD cbLen;
DWORD cbRead;
// Read the number of byte to read (cbLen).
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
return false;
}
// Read the bytes
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
return false;
}
return true;
}
Per risolvere il problema, verificare le dimensione del buffer come indicato nel codice seguente:
bool f(HANDLE hFile)
{
char buff[MAX_PATH];
DWORD cbLen;
DWORD cbRead;
// Read the number of byte to read (cbLen).
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
return false;
}
// Ensure that there's enough space in the buffer to read that many bytes.
if (cbLen > sizeof(buff))
{
return false;
}
// Read the bytes
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
return false;
}
return true;
}