Upozornění C26833
Velikost přidělení může být výsledkem číselného přetečení před vázanou kontrolou.
Poznámky
Toto upozornění hlásí, že velikost zadaná pro přidělení může být výsledkem číselného přetečení. Příklad:
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;
}
size > 50
Kontrola je příliš pozdě. Pokud i + j
přeteče, vytvoří malou hodnotu, která předá kontrolu. SmallAlloc
Pak přidělí vyrovnávací paměť menší, 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, ujistěte se, že i+j
nejde přetékat. Příklad:
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;
}
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro