Sdílet prostřednictvím


Varování C26832

Velikost přidělení je výsledkem zužujícího převodu, který by mohl vést k přetečení.

Poznámky

Toto upozornění hlásí, že velikost zadaná pro přidělení může být výsledkem zužujícího převodu, který vede k číselnému přetečení. Příklad:

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

Ve výrazu i + jjsou obě i a j jsou povýšeny na celá čísla a výsledek sčítání je uložen v dočasném celočíselném čísle. Pak se dočasné celé číslo implicitně přetypuje na před unsigned short uložením hodnoty v size. Přetypování může unsigned short přetékat, v takovém případě SmallAlloc může vrátit menší vyrovnávací paměť, než se čekalo. To pravděpodobně povede k tomu, že se později pokusí o přístup k vyrovnávací paměti mimo hranice. Tento vzor kódu může vést k ohrožením zabezpečení vzdáleného spuštění kódu.

Tato kontrola platí pro běžné funkce přidělování, jako je new, malloca VirtualAlloc. Kontrola platí také pro vlastní funkce alokátoru, které mají alloc v názvu funkce (nerozlišují malá a velká písmena).

Tato kontrola někdy nedokáže rozpoznat, že určité kontroly můžou zabránit přetečení, protože kontrola je konzervativní.

Toto upozornění je k dispozici v sadě Visual Studio 2022 verze 17.7 a novějších verzích.

Příklad

Pokud chcete opravit předchozí příklad kódu, ve kterém i+j by mohlo přetékat, zaveďte kontrolu, abyste se ujistili, že to nebude. Příklad:

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

Viz také

C26831
C26833