Предупреждение 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)- аннотированной длины.
Этот анализ не может поймать все возможные индексы из пределов, так как не все арифметические могут быть точно проанализированы. Он настроен на отчеты в случаях, когда он может гарантировать, что индекс вне границ может быть возможным. Отсутствие предупреждения не означает, что индекс гарантированно находится в границах.