Upozornění C6201
Index "index-name" je mimo platný rozsah indexu "minimum" až "maximum" pro pravděpodobně přidělenou vyrovnávací paměť zásobníku "proměnná"
Toto upozornění označuje, že posun celého čísla do zadaného pole zásobníku překračuje maximální mez tohoto pole. Může to potenciálně způsobit chyby přetečení zásobníku, nedefinované chování nebo chybové ukončení.
Poznámky
Jednou z běžných příčin této chyby je použití velikosti pole jako indexu do pole. Protože indexování pole C/C++ je založené na nule, maximální právní index do pole je o jednu menší než počet prvků pole.
Název analýzy kódu: INDEX_EXCEEDS_MAX
Příklad
Následující kód vygeneruje upozornění C6201. Podmínka for
smyčky překračuje platný rozsah indexu, buff
pokud se nastaví i
na 14, což je jeden prvek za koncem:
void f()
{
int buff[14]; // array of 0..13 elements
for (int i = 0; i <= 14; i++) // i == 14 exceeds the bounds
{
buff[i] = 0; // initialize buffer
}
}
Pokud chcete upozornění opravit, ujistěte se, že index zůstane v mezích. Následující kód ukazuje opravenou podmínku smyčky:
void f()
{
int buff[14]; // array of 0..13 elements
for (int i = 0; i < 14; i++) // i == 13 on the final iteration
{
buff[i]= 0; // initialize buffer
}
}
Heuristika
Tato analýza je omezená na pole přidělená zásobníkem. Nebere v úvahu například pole předaná do funkce s délkou poznámek zdrojového kódu Microsoftu (SAL).
Tato analýza nemůže zachytit všechny možné indexy mimo hranice, protože ne všechny aritmetické můžou být přesně analyzovány. Je vyladěná na případy, kdy může zaručit, že index mimo hranice je možný. Absence upozornění neznamená, že index je zaručený v mezích.