Ostrzeżenie C26832

Rozmiar alokacji jest wynikiem konwersji zawężającej, która może spowodować przepełnienie

Uwagi

To ostrzeżenie zgłasza, że rozmiar określony dla alokacji może być wynikiem konwersji zawężającej, która powoduje przepełnienie liczbowe. Przykład:

void* SmallAlloc(int);

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

W wyrażeniu i + jzarówno , jak i i j są promowane do liczb całkowitych, a wynik dodawania jest przechowywany w tymczasowej liczbą całkowitą. Następnie tymczasowa liczba całkowita jest niejawnie rzutowana na element unsigned short przed zapisaniem wartości w obiekcie size. Rzutowanie do może przepełnić unsigned short się, w tym przypadku SmallAlloc może zwrócić mniejszy bufor 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, 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(unsigned short i, unsigned short j)
{
    if (i > 100 || j > 100)
        return;

    unsigned short size = i + j;
    
    int* p = (int*)SmallAlloc(size);
    p[i] = 5;
}

Zobacz też

C26831
C26833