Condividi tramite


Avviso C26831

Le dimensioni di allocazione possono essere il risultato di un overflow numerico

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(int i, int j)
{
    int* p = (int*)SmallAlloc(i + j); // Warning: C26831
    p[i] = 5;
}

Se i+j l'overflow viene eseguito, SmallAlloc restituisce un buffer inferiore al 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.

Il controllo si applica alle funzioni di allocazione comuni, ad esempio new, malloce 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(int i, int j)
{
    if (i < 0 || j < 0 )
    {
        return;
    }

    if (i > 100 || j > 100)
    {
        return;
    }

    int* p = (int*)SmallAlloc(i + j);
    p[i] = 5;
}

Vedi anche

C26832
C26833