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. Na 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 + j
zaró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
, malloc
i 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;
}