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. Na 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