Condividi tramite


Avviso C6201

L'indice 'index-name' non è compreso nell'intervallo di indici valido 'minimum' a 'maximum' per un possibile buffer allocato dello stack 'variable'

Questo avviso indica che un offset integer nella matrice dello stack specificata supera i limiti massimi di tale matrice. Potrebbe causare errori di overflow dello stack, comportamento non definito o arresti anomali.

Osservazioni:

Una causa comune di questo difetto consiste nell'usare le dimensioni di una matrice come indice nella matrice. Poiché l'indicizzazione di matrici C/C++ è in base zero, l'indice legale massimo in una matrice è minore del numero di elementi della matrice.

Nome dell'analisi del codice: INDEX_EXCEEDS_MAX

Esempio

Il codice seguente genera l'avviso C6201. La for condizione del ciclo supera l'intervallo di indice valido per buff quando viene impostato i su 14, ovvero un elemento oltre la fine:

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

Per correggere l'avviso, assicurarsi che l'indice rimanga in limiti. Il codice seguente mostra la condizione del ciclo corretta:

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

Euristica

Questa analisi è limitata alle matrici allocate allo stack. Non considera, ad esempio, matrici passate alla funzione con una lunghezza annotata del codice sorgente Microsoft (SAL).

Questa analisi non può intercettare tutti i possibili indici fuori dai limiti perché non tutti gli aritmetici possono essere analizzati con precisione. È ottimizzato per segnalare i casi in cui è possibile garantire un indice fuori limite. L'assenza di un avviso non significa che l'indice sia garantito in limiti.