Udostępnij za pośrednictwem


Ostrzeżenie C26833

Rozmiar alokacji może być wynikiem przepełnienia liczbowego przed sprawdzeniem ograniczenia

Uwagi

To ostrzeżenie zgłasza, że rozmiar określony dla alokacji może być wynikiem przepełnienia liczbowego. Przykład:

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

Sprawdzanie size > 50 jest za późno. W przypadku i + j przepełnienia generuje niewielką wartość, która przechodzi sprawdzanie. SmallAlloc Następnie przydziela bufor mniejszy niż oczekiwano. Prawdopodobnie doprowadzi to do wyreje z granic prób uzyskania dostępu do buforu później. Ten wzorzec kodu może spowodować luki w zabezpieczeniach zdalnego wykonywania kodu.

Ta kontrola dotyczy typowych funkcji alokacji, takich jak new, malloci VirtualAlloc. Sprawdzanie dotyczy również niestandardowych funkcji alokatora, które mają alloc (bez uwzględniania wielkości liter) w nazwie funkcji.

Ta kontrola czasami nie rozpoznaje, że niektóre kontrole mogą zapobiec przepełnieniu, ponieważ sprawdzanie jest konserwatywne.

To ostrzeżenie jest dostępne w programie Visual Studio 2022 w wersji 17.7 lub nowszej.

Przykład

Aby naprawić poprzedni przykład kodu, upewnij się, że i+j nie można przepełnić. Na przykład:

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

Zobacz też

C26831
C26832