Выполните один или несколько из этих шагов, пока вы не определите фиксацию для проверки Out of bounds array index. Существует несколько способов зафиксировать проверку. Для описания проверки и примеров кода, смотрите Out of bounds array index
.
Иногда, специально для оранжевой проверки, можно решить, что проверка не представляет действительную ошибку, но предположение Polyspace®, которое не верно для кода. Если можно использовать аналитическую опцию, чтобы ослабить предположение, повторно выполнить верификацию с помощью той опции. В противном случае можно добавить комментарий и выравнивание в результате или коде.
Для общего рабочего процесса, который применяется ко всем проверкам, смотрите, Интерпретируют Результаты Polyspace Code Prover.
Установите свой курсор на символ [
.
Получите следующую информацию из подсказки:
Размер массивов. Позволенная область значений для индекса массива 0 к (размер массивов - 1).
Фактическая область значений для индекса массива
В предыдущем примере размер массивов равняется 10. Поэтому позволенная область значений для индекса массива от 0 до 9. Однако фактическая область значений от 0 до 10.
Возможная фиксация: Чтобы избежать за пределы индекса массива, получите доступ к массиву, только если индекс между 0 и (размер массивов - 1).
#define SIZE 100 int arr[SIZE]; . . if(i<SIZE) val = arr[i] else /*Error handling */
Если вы хотите знать или изменить размер массивов, щелкните правой кнопкой по переменной типа массив и выберите Go To Definition, если опция существует. В противном случае проследите поток данных, начинающий с переменной индекса массива. Идентифицируйте точку, где можно ограничить индексную переменную.
Чтобы проследить поток данных, выберите проверку и отметьте информацию о панели Result Details.
Если панель Result Details показывает последовательность инструкций, которые приводят к проверке, выбирают каждую инструкцию.
Если панель Result Details показывает номер строки вероятной причины для проверки, щелкните правой кнопкой по панели Source. Выберите Go To Line.
В противном случае:
Найдите предыдущие экземпляры переменной индекса массива.
Просмотрите те экземпляры. Найдите экземпляр, где вы ограничиваете переменную индекса массива к (размер массивов - 1).
Возможная фиксация: Если вы не находите экземпляр, где вы ограничиваете индексную переменную, задаете ограничение для переменной. Например:
if(index<SIZE) read(array[index]);
Определите, применяется ли ограничение к экземпляру, где ошибка Out of bounds array index происходит.
Например, можно ограничить индексную переменную в цикле for
с помощью for(index=0; index<SIZE; index++)
. Однако вы получаете доступ к массиву вне цикла, где ограничение не применяется.
Возможная фиксация: Займитесь расследованиями, почему ограничение не применяется. Смотрите, необходимо ли ограничить индексную переменную снова.
Если индексная переменная получена из другой переменной, проследите поток данных для второй переменной. Определите, ограничили ли вы ту вторую переменную к (размер массивов - 1).
В зависимости от переменной используйте следующие ярлыки навигации, чтобы найти предыдущие экземпляры. Можно выполнить следующие шаги в пользовательском интерфейсе Polyspace только.
Переменная | Как найти предыдущие экземпляры переменной |
---|---|
Локальная переменная | Используйте один из следующих методов:
|
Глобальная переменная Щелкните правой кнопкой по переменной. Если опция, Show In Variable Access View появляется, переменная, является глобальной переменной. |
|
Функциональное возвращаемое значение
ret=func(); |
|
Можно также определить, связаны ли переменные в какой-либо операции от некоторой предыдущей операции. Смотрите Находят Отношения Между Переменными в Коде.
Ищите частые причины проверки Out of bounds array index.
Смотрите, начинаете ли вы переменную индекса массива от 0.
В условии, которое ограничивает вашу переменную индекса массива, смотрите, используете ли вы <=
, когда вы намеревались использовать <
.
Если проверка происходит в или сразу после for
или цикла while
, определите, необходимо ли сократить количество выполнений цикла.
Если вы используете функцию sizeof
, чтобы ограничить ваш массив, смотрите, делите ли вы sizeof(array)
на sizeof(array[0])
, чтобы получить размер массивов.
sizeof(array)
возвращает размер массивов в байтах.
Смотрите, можно ли проследить оранжевую проверку до предположения Polyspace, которое происходит ранее в коде. Если предположение не сохраняется в вашем случае, добавьте комментарий или выравнивание в вашем результате или коде. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.
Например, вы ограничиваете индекс массива с помощью функции, определение которой вы не обеспечиваете. Затем:
Polyspace не может решить, что переменная индекса массива ограничивается.
Когда вы используете эту переменную в качестве индекса массива, ошибка Out of bounds array index может произойти.
Если вы знаете, что переменная ограничивается к размеру массивов, добавьте комментарий и выравнивание, описывающее, почему вы не изменили свой код.
Для получения дополнительной информации смотрите Аналитические Предположения Программы автоматического доказательства Кода.
Прежде, чем выровнять по ширине оранжевую проверку, рассмотрите тщательно, можно ли улучшить проект кодирования.
Например, ограничение глобальной переменной в одной функции и использование ее как индекс массива во второй функции вызывают уязвимости в вашем коде. Если новая функция вызвана между предыдущими двумя функциями и изменяет вашу глобальную переменную, ограничение больше не применяется.