Предупреждение C6200

Индекс "index" не является допустимым диапазоном индексов "min" до "max" для буфера nonstack "имя параметра"

Это предупреждение указывает на то, что целочисленное смещение в указанный массив нестек превышает максимальные границы этого массива, что приводит к неопределенности поведения и потенциально завершается сбоем.

Замечания

Одна из распространенных причин этого дефекта заключается в использовании размера массива в качестве индекса в массиве. Так как индексирование массива C/C++ основано на нулях, максимальный юридический индекс в массив меньше числа элементов массива.

Имя анализа кода: INDEX_EXCEEDS_MAX_NONSTACK

Пример

Следующий код создает это предупреждение. Эта проблема связана с for циклом, превышающим диапазон индекса, попытка получить доступ к индексу 14 (15-му элементу), когда индекс 13 (14-й элемент) является последним:

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

Чтобы исправить оба предупреждения, используйте правильный размер массива, как показано в следующем коде:

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

Эвристика

Анализ кода не всегда может доказать, находится ли индекс массива в диапазоне. Это может произойти, например, если индекс вычисляется из сложного выражения, включая те выражения, которые вызывают другие функции. В этих случаях анализ кода может вернуться к другим подсказкам для определения диапазона выражения индекса массива.

Например, рассмотрим следующую функцию, которая используется rand() в вычислениях индекса в качестве автономной для вызова функции, который не может проанализировать этот анализ кода:

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

Анализ кода не предупреждает только rand() потому, что у него нет сведений о его возвращаемом значении. С другой стороны, rand() % 15 и rand() % 14 указать, что диапазон возвращаемого значения rand() и анализа кода может использовать эти сведения, чтобы определить, что индекс выходит из границ в первом случае, но не второй.