Предупреждение 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()
и анализа кода может использовать эти сведения, чтобы определить, что индекс выходит из границ в первом случае, но не второй.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по