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. Na 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
, 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(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;
}