Udostępnij za pośrednictwem


Ostrzeżenie C26831

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

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(int i, int j)
{
    int* p = (int*)SmallAlloc(i + j); // Warning: C26831
    p[i] = 5;
}

W przypadku i+j przepełnienia SmallAlloc zwraca bufor, który jest 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.

Sprawdzanie 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, w którym i+j może przepełnić się, wprowadź sprawdzenie, aby upewnić się, że nie będzie. Na przykład:

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

Zobacz też

C26832
C26833