exponenta event banner

Проверка и устранение ошибок при проверке индекса массива Bounds

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

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

Общий рабочий процесс, применяемый ко всем проверкам, см. в разделе Интерпретация результатов проверки кода в пользовательском интерфейсе Polyspace Desktop.

Шаг 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: Определение первопричины проверки

Если требуется узнать или изменить размер массива, щелкните правой кнопкой мыши переменную массива и выберите «Перейти к определению», если параметр существует. В противном случае выполните трассировку потока данных, начиная с переменной индекса массива. Укажите точку, в которой можно ограничить индексную переменную.

Чтобы отследить поток данных, установите флажок и запишите информацию на панели Сведения о результате (Result Details).

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

  • Если на панели Сведения о результате (Result Details) отображается номер строки вероятной причины проверки, щелкните правой кнопкой мыши панель Источник (Source). Выберите «Перейти к строке».

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

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

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

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

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

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

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

      Возможное исправление: узнайте, почему ограничение не применяется. Проверьте, нужно ли снова ограничивать индексную переменную.

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

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

ПеременнаяПоиск предыдущих экземпляров переменной

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

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

  • Поиск переменной.

    1. Щелкните правой кнопкой мыши переменную. Выберите Поиск всех привязок (Search For All References).

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

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

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

    1. Дважды щелкните переменную на панели «Источник».

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

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

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

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

  1. Выберите опцию Показать в представлении переменного доступа (Show In Variable Access View).

    На панели «Доступ к переменной» отображается текущий экземпляр переменной.

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

    Операции записи для переменной обозначаются с помощью, а операции чтения - с помощью.

Возвращаемое значение функции

ret=func();

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

    Щелкните правой кнопкой мыши func на панели «Источник». Выберите «Перейти к определению», если опция существует. Если определение недоступно для Polyspace, выбор опции приводит к объявлению функции.

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

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

Шаг 3: Поиск общих причин проверки

Найдите общие причины проверки индекса массива Out of bounds.

  • Проверьте, начинается ли переменная индекса массива с 0.

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

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

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

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

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

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

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

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

  2. При использовании этой переменной в качестве индекса массива может возникнуть ошибка индекса массива вне границ.

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

Дополнительные сведения см. в разделе Допущения анализа проверки кода.

Примечание

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

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