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

Индекс "index-name" не является допустимым диапазоном индексов "минимальный" до "максимум" для возможного буфера стека выделенного буфера "переменная".

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

Замечания

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

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

Пример

Следующий код создает предупреждение C6201. Условие for цикла превышает допустимый диапазон buff индексов, если он задает i значение 14, что является одним элементом после конца:

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

Чтобы исправить предупреждение, убедитесь, что индекс остается в границах. В следующем коде показано исправленное условие цикла:

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

Эвристика

Этот анализ ограничен массивами, выделенными стека. Например, массивы, передаваемые в функцию, не учитываются с использованием языка заметок исходного кода (SAL)- аннотированной длины.

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