exponenta event banner

Проверка и исправление проверок переполнения

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

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

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

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

Установите курсор на переполняющую операцию.

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

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

    В предыдущем примере левый операнд, val, имеет полный диапазон значений.

    Возможное исправление: Чтобы избежать переполнения, выполняйте умножение только в том случае, если val находится в определенном диапазоне.

    if(val < INT_MAX/2)
        return(val*2);
    else 
        /* Alternate action */
  • Вероятная причина переполнения, если указано во всплывающей подсказке.

    В предыдущем примере программное обеспечение идентифицирует упертую функцию, getVal, в качестве вероятной причины.

    Возможное исправление: Чтобы избежать переполнения, ограничьте возвращаемое значение getVal. Например, укажите, что getVal возвращает значения в определенном диапазоне, например, 1..10. Дополнительные сведения см. в разделе Допущения о упорных функциях.

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

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

В следующем примере трассировка потока данных, начиная с tempVal.

val = func();
.
.
tempVal = val;
.
.
tempVal++ ;
В этом примере можно найти следующее:

  1. tempVal получает полный диапазон значений из val.

    Возможное исправление: Назначить val кому tempVal только если val меньше определенного значения.

  2. val получает полный диапазон значений из func.

    Возможное исправление: Ограничение возвращаемого значения func, либо в теле func или через интерфейс спецификации ограничений Polyspace, если func упряжен. Дополнительные сведения см. в разделе Допущения о упорных функциях.

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

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

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

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

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

      Пример: Предыдущая операция записи на tempVal является tempVal=val.

    2. При предыдущей операции записи определите новую переменную для обратной трассировки.

      Установите курсор на переменные, участвующие в операции записи, чтобы увидеть их значения. Значения помогают выбрать переменную для трассировки.

      Пример: В tempVal=val, вы находите, что val имеет полный диапазон значений. Поэтому вы отслеживаете val.

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

      Пример: Предыдущая операция записи на val является val=func(). Можно задать ограничение для возвращаемого значения func.

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

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

Совет

Чтобы различать целочисленные и плавающие переполнения, используйте столбец Подробности (Detail) на панели Список результатов (Results List). Щелкните заголовок столбца, чтобы группировать целочисленные переполнения и переполнения с плавающей запятой. Если столбец подробных данных не отображается, щелкните правой кнопкой мыши любой другой заголовок столбца и включите этот столбец.

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

Если операция, вызывающая переполнение, происходит в цикле или в теле рекурсивной функции:

  • Проверьте, можно ли уменьшить количество циклов или рекурсий.

  • Проверьте, можно ли поместить условие выхода в цикл или рекурсивную функцию до переполнения операции.

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

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

Например, в коде используется изменчивая переменная. Затем:

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

  2. Операция, использующая эту переменную, может переполняться и поэтому является оранжевой.

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

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

Примечание

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