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