Condividi tramite


Avviso 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, 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, 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;
}

Vedi anche

C26831
C26832