Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
warning C6029: possible buffer overrun in call to <function>: use of unchecked value
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 controllare se sono di dimensioni inferiori a quella del buffer.Un utente malintenzionato potrebbe specificare un valore molto maggiore di quello previsto per la dimensione, determinando un sovraccarico del buffer.
In genere, quando si leggono i dati da un'origine esterna non attendibile, è consigliabile accertarsi di verificarne la validità.Di solito è consigliabile verificare le dimensioni per accertarsi che rientrino nell'intervallo previsto.
Esempio
Il codice seguente genera questo avviso chiamando due volte la funzione annotata ReadFile.Dopo la prima chiamata, la proprietà dell'attributo Post contrassegna il valore del secondo parametro come non attendibile.Il passaggio di un valore non attendibile nella seconda chiamata a ReadFile genera quindi questo avviso, come illustrato 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 dimensioni 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;
}