Sdílet prostřednictvím


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.