Avvertimento C26832
Le dimensioni di allocazione sono il risultato di una conversione verso un tipo di dati più ristretto che potrebbe comportare un overflow
Osservazioni:
Questo avviso segnala che le dimensioni specificate per un'allocazione possono essere il risultato di una conversione di tipo narrowing che comporta un overflow numerico. Ad esempio:
void* SmallAlloc(int);
void foo(unsigned short i, unsigned short j)
{
unsigned short size = i + j;
int* p = (int*)SmallAlloc(size); // Warning: C26832
p[i] = 5;
}
Nell'espressione i + j
, sia i
che j
vengono promossi a numeri interi e il risultato dell'addizione viene archiviato in un intero temporaneo. Viene quindi eseguito il cast implicito dell'intero temporaneo a un unsigned short
oggetto prima che il valore venga archiviato in size
. Il cast a unsigned short
potrebbe sovraflow, nel qual caso SmallAlloc
può restituire 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 in cui i+j
è possibile eseguire l'overflow, introdurre un controllo per assicurarsi che non lo faccia. Ad esempio:
void *SmallAlloc(int);
void foo(unsigned short i, unsigned short j)
{
if (i > 100 || j > 100)
return;
unsigned short size = i + j;
int* p = (int*)SmallAlloc(size);
p[i] = 5;
}