Advertencia C6200

El índice 'index' está fuera del intervalo de índice válido 'min' a 'max' para el búfer nostack 'parameter-name'

Esta advertencia indica que un desplazamiento entero en la matriz nostack especificada supera los límites máximos de esa matriz, lo que provoca un comportamiento indefinido y, posiblemente, se bloquea.

Comentarios

Una causa común de este defecto es usar el tamaño de una matriz como índice en la matriz. Dado que la indexación de matrices de C/C++ está basada en cero, el índice válido máximo en una matriz es uno menor que el número de elementos de matriz.

Nombre del análisis de código: INDEX_EXCEEDS_MAX_NONSTACK

Ejemplo

El código siguiente genera esta advertencia. Este problema se deriva del bucle que supera el for intervalo de índices, intentando tener acceso al índice 14 (el 15º elemento) cuando el índice 13 (el 14º elemento) es el último:

void f()
{
    int* buff = new int[14]; // array of 0..13 elements
    for (int i = 0; i <= 14; i++) // i exceeds the index
    {
        buff[i] = 0; // warning C6200
    }
    delete[] buff;
}

Para corregir ambas advertencias, use el tamaño de matriz correcto, como se muestra en el código siguiente:

void f()
{
    int* buff = new int[14]; // array of 0..13 elements
    for (int i = 0; i < 14; i++) // i == 13 on the final iteration
    {
        buff[i] = 0; // initialize buffer
    }
    delete[] buff;
}

Heurística

El análisis de código no siempre puede demostrar si un índice de matriz está en el intervalo. Esto puede ocurrir, por ejemplo, cuando el índice se calcula desde una expresión compleja, incluidas esas expresiones que llaman a otras funciones. En estos casos, el análisis de código puede revertirse a otras pistas para determinar el intervalo en el que puede caer una expresión de índice de matriz.

Por ejemplo, considere la siguiente función que usa rand() en los cálculos de índice como stand-in para una llamada de función que el análisis de código no puede analizar:

#include <stdlib.h>

void f()
{
    int* buff = new int[14];
    for (int i = 1; i < 14; i++)
    {
        buff[rand()] = 0;       // no warning, nothing is known about the return value of rand()
        buff[rand() % 15] = 0;  // warning C6200, rand() % 15 is known to be in the range 0..14 and index 14 is out of bounds
        buff[rand() % 14] = 0;  // no warning, rand() % 14 is known to be in the range 0..13
    }
    delete[] buff;
}

El análisis de código no advierte solo rand() porque no tiene información sobre su valor devuelto. Por otro lado, rand() % 15 y rand() % 14 proporcionar sugerencias sobre el intervalo del valor devuelto de rand() y el análisis de código puede usar esa información para determinar que el índice está fuera de los límites en el primer caso, pero no en el segundo.