Sdílet prostřednictvím


Upozornění C26833

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

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(unsigned i, unsigned j)
{
    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

    int* p = (int*)SmallAlloc(size + 5); // Warning: C26833
    p[j] = 5;
}

size > 50 Kontrola je příliš pozdě. Pokud i + j přeteče, vytvoří malou hodnotu, která předá kontrolu. SmallAlloc Pak přidělí vyrovnávací paměť 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.

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, ujistěte se, že i+j nejde přetékat. Příklad:

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

Viz také

C26831
C26832