Avvertimento C26833
Le dimensioni di allocazione possono essere il risultato di un overflow numerico prima del controllo associato
Osservazioni:
Questo avviso segnala che le dimensioni specificate per un'allocazione possono essere il risultato di un overflow numerico. Ad esempio:
void* SmallAlloc(int);
void foo(unsigned i, unsigned j)
{
unsigned size = i + j;
if (size > 50)
{
return;
}
int* p = (int*)SmallAlloc(size + 5); // Warning: C26833
p[j] = 5;
}
Il controllo è size > 50
troppo tardi. In i + j
caso di overflow, produce un valore piccolo che supera il controllo. SmallAlloc
Alloca quindi un buffer più piccolo del previsto. Ciò consentirà probabilmente di uscire dai limiti di tentativi di accesso al buffer in un secondo momento. Questo modello di codice può causare vulnerabilità di esecuzione remota del codice.
Questo controllo si applica alle funzioni di allocazione comuni, ad esempio new
, malloc
e VirtualAlloc
. Il controllo si applica anche alle funzioni di allocatore personalizzate con alloc
(senza distinzione tra maiuscole e minuscole) nel nome della funzione.
Questo controllo a volte non riesce a riconoscere che alcuni controlli possono impedire gli overflow perché il controllo è conservativo.
Questo avviso è disponibile in Visual Studio 2022 versione 17.7 e versioni successive.
Esempio
Per correggere l'esempio di codice precedente, assicurarsi che i+j
non sia possibile eseguire l'overflow. Ad esempio:
void* SmallAlloc(int);
void foo(unsigned i, unsigned j)
{
if (i > 100 || j > 100)
{
return;
}
unsigned size = i + j;
if (size > 50)
{
return;
}
int* p = (int*)SmallAlloc(size + 5);
p[j] = 5;
}