Sdílet prostřednictvím


Upozornění C26831

Velikost přidělení může být výsledkem číselného přetečení.

Poznámky

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

void *SmallAlloc(int);

void foo(int i, int j)
{
    int* p = (int*)SmallAlloc(i + j); // Warning: C26831
    p[i] = 5;
}

Pokud i+j přetečení, vrátí vyrovnávací paměť, SmallAlloc která je menší, 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.

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

Viz také

C26832
C26833