Рассмотрите и зафиксируйте за пределы проверки индекса массива

Выполните один или несколько из этих шагов, пока вы не определите фиксацию для проверки Out of bounds array index. Существует несколько способов зафиксировать проверку. Для описания проверки и примеров кода, смотрите Out of bounds array index.

Иногда, особенно для оранжевой проверки, можно решить, что проверка не представляет действительную ошибку, но предположение Polyspace®, которое не верно для кода. Если можно использовать опцию анализа, чтобы ослабить предположение, повторно выполнить верификацию с помощью той опции. В противном случае можно добавить комментарий и выравнивание в результате или коде.

Для общего рабочего процесса, который применяется ко всем проверкам, смотрите, Интерпретируют Результаты Программы автоматического доказательства Кода в Пользовательском интерфейсе Рабочего стола Polyspace.

Шаг 1: интерпретируйте информацию о проверке

Установите свой курсор на [ символ.

Получите следующую информацию из подсказки:

  • Размер массивов. Позволенная область значений для индекса массива 0 к (размер массивов - 1).

  • Фактическая область значений для индекса массива

В предыдущем примере размер массивов равняется 10. Поэтому позволенная область значений для индекса массива от 0 до 9. Однако фактическая область значений от 0 до 10.

Возможная фиксация: Чтобы избежать за пределы индекса массива, получите доступ к массиву, только если индекс между 0 и (размер массивов - 1).

#define SIZE 100
int arr[SIZE];
.
.
if(i<SIZE)
	val = arr[i]
else
	/*Error handling */

Шаг 2: определите первопричину проверки

Если вы хотите знать или изменить размер массивов, щелкните правой кнопкой по переменной типа массив и выберите Go To Definition, если опция существует. В противном случае проследите поток данных, начинающий с переменной индекса массива. Идентифицируйте точку, где можно ограничить индексную переменную.

Чтобы проследить поток данных, выберите проверку и отметьте информацию о панели Result Details.

  • Если панель Result Details показывает последовательность инструкций, которые приводят к проверке, выбирают каждую инструкцию.

  • Если панель Result Details показывает номер строки вероятной причины для проверки, щелкните правой кнопкой по панели Source. Выберите Go To Line.

  • В противном случае:

    1. Найдите предыдущие экземпляры переменной индекса массива.

    2. Просмотрите те экземпляры. Найдите экземпляр, где вы ограничиваете переменную индекса массива к (размер массивов - 1).

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

      if(index<SIZE)
      	read(array[index]);

    3. Определите, применяется ли ограничение к экземпляру, где ошибка Out of bounds array index происходит.

      Например, можно ограничить индексную переменную в for цикл с помощью for(index=0; index<SIZE; index++). Однако вы получаете доступ к массиву вне цикла, где ограничение не применяется.

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

    4. Если индексная переменная получена из другой переменной, проследите поток данных для второй переменной. Определите, ограничили ли вы ту вторую переменную к (размер массивов - 1).

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

ПеременнаяКак найти предыдущие экземпляры переменной

Локальная переменная

Используйте один из следующих методов:

  • Ищите переменную.

    1. Щелкните правой кнопкой по переменной. Выберите Search For All References.

      Все экземпляры переменной появляются на панели Search с текущим подсвеченным экземпляром.

    2. На панели Search выберите предыдущие экземпляры.

  • Просмотрите исходный код.

    1. Дважды кликните переменную на панели Source.

      Все экземпляры переменной подсвечены.

    2. Прокрутите, чтобы найти предыдущие экземпляры.

Глобальная переменная

Щелкните правой кнопкой по переменной. Если опция, Show In Variable Access View появляется, переменная, является глобальной переменной.

  1. Выберите опцию Show In Variable Access View.

    На панели Variable Access показывают текущий экземпляр переменной.

  2. На этой панели выберите предыдущие экземпляры переменной.

    Операции записи на переменной обозначаются с и операции чтения с.

Функциональное возвращаемое значение

ret=func();

  1. Найдите функциональное определение.

    Щелкните правой кнопкой по func на панели Source. Выберите Go To Definition, если опция существует. Если определение не доступно для Polyspace, выбирание опции берет вас к объявлению функции.

  2. В определении func, идентифицируйте каждый return оператор. Переменная, которую возвращает функция, является вашей новой переменной, чтобы проследить.

Можно также определить, связаны ли переменные в какой-либо операции от некоторой предыдущей операции. Смотрите Находят Отношения Между Переменными в Коде.

Шаг 3: ищите частые причины проверки

Ищите частые причины проверки Out of bounds array index.

  • Смотрите, начинаете ли вы переменную индекса массива от 0.

  • В условии, которое ограничивает вашу переменную индекса массива, смотрите, используете ли вы <= когда вы намеревались использовать <.

  • Если проверка происходит в или сразу после for или while цикл, определите, необходимо ли сократить количество запусков цикла.

  • Если вы используете sizeof функция, чтобы ограничить ваш массив, смотрите, делите ли вы sizeof(array) sizeof(array[0]) получить размер массивов.

    sizeof(array) возвращает размер массивов в байтах.

Шаг 4: проследите проверку до предположения Polyspace

Смотрите, можно ли проследить оранжевую проверку до предположения Polyspace, которое происходит ранее в коде. Если предположение не сохраняется в вашем случае, добавьте комментарий или выравнивание в вашем результате или коде. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Например, вы ограничиваете индекс массива с помощью функции, определение которой вы не обеспечиваете. То:

  1. Polyspace не может решить, что переменная индекса массива ограничивается.

  2. Когда вы используете эту переменную в качестве индекса массива, ошибка Out of bounds array index может произойти.

  3. Если вы знаете, что переменная ограничивается к размеру массивов, добавьте комментарий и выравнивание, описывающее, почему вы не изменили свой код.

Для получения дополнительной информации смотрите Аналитические Предположения Программы автоматического доказательства Кода.

Примечание

Прежде, чем выровнять по ширине оранжевую проверку, рассмотрите тщательно, можно ли улучшить проект кодирования.

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