Varování C26832
Velikost přidělení je výsledkem zužujícího převodu, který by mohl vést k přetečení.
Poznámky
Toto upozornění hlásí, že velikost zadaná pro přidělení může být výsledkem zužujícího převodu, který vede k číselnému přetečení. Příklad:
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;
}
Ve výrazu i + j
jsou obě i
a j
jsou povýšeny na celá čísla a výsledek sčítání je uložen v dočasném celočíselném čísle. Pak se dočasné celé číslo implicitně přetypuje na před unsigned short
uložením hodnoty v size
. Přetypování může unsigned short
přetékat, v takovém případě SmallAlloc
může vrátit menší vyrovnávací paměť, než se čekalo. To pravděpodobně povede k tomu, že se později pokusí o přístup k vyrovnávací paměti mimo hranice. Tento vzor kódu může vést k ohrožením zabezpečení vzdáleného spuštění kódu.
Tato kontrola platí pro běžné funkce přidělování, jako je new
, malloc
a VirtualAlloc
. Kontrola platí také pro vlastní funkce alokátoru, které mají alloc
v názvu funkce (nerozlišují malá a velká písmena).
Tato kontrola někdy nedokáže rozpoznat, že určité kontroly můžou zabránit přetečení, protože kontrola je konzervativní.
Toto upozornění je k dispozici v sadě Visual Studio 2022 verze 17.7 a novějších verzích.
Příklad
Pokud chcete opravit předchozí příklad kódu, ve kterém i+j
by mohlo přetékat, zaveďte kontrolu, abyste se ujistili, že to nebude. Příklad:
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;
}