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.