exponenta event banner

Проверка и исправление проверок утверждения пользователя

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

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

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

Как использовать этот чек: Обычно вы используете assert операторы во время отладки, чтобы проверить, удовлетворяется ли условие в текущей точке кода. Например, если требуется переменная var чтобы иметь значения в диапазоне [1,10] в определенный момент в коде следует поместить следующую инструкцию:

assert(var >=1 && var <= 10);
Polyspace статически определяет, выполняется ли условие.

Поэтому можно разумно вставить assert операторы, которые проверяют требования из вашего кода.

  • Красный результат проверки утверждения пользователя указывает на то, что требование определенно не выполнено.

  • Оранжевый результат проверки утверждения пользователя указывает на то, что требование, возможно, не выполнено.

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

Трассировка потока данных для каждой переменной, задействованной в assert заявление.

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

int* getArray(int numberOfElements) {
    .
    .
    arrayPtr = (int*) malloc(numberOfElements);
    .
    .
    return arrayPtr;
}
void func() {
    int* myArray = getArray(10);
    assert(myArray!=NULL);
    .
    .
}
В этом примере возможно, что в getArray, возвращаемое значение malloc не проверено для NULL.

Возможное исправление: Если вы ожидаете определенного требования, проверьте, есть ли у вас тесты, которые исполняют требование. В этом примере, если вы ожидаете getArray для возврата значения, отличного отNULL значение, в getArray, проверьте возвращаемое значение malloc для NULL.

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

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

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

  • В противном случае для каждой переменной, участвующей в условии, найдите предыдущие экземпляры и выполните трассировку до основной причины проверки. Дополнительные сведения об общих первопричинах см. в разделе Шаг 3: Поиск общих причин проверки.

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

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

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

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

    • Для просмотра вызывающих абонентов функции выберите имя функции на панели «Источник». Все вызывающие абоненты отображаются на панели «Иерархия вызовов». Выберите имя вызывающего абонента для перехода к нему в источнике.

    • Чтобы определить, вызывает ли подмножество вызовов проверку оранжевого цвета, используйте опцию Sensitivity context (-context-sensitivity). Учебное пособие см. в разделе Идентификация вызова функции с ошибкой времени выполнения.

  2. Если имеются тесты, обеспечивающие выполнение требования утверждения, см.:

    • Утверждение входит в объем испытаний.

    • Переменные теста изменяются между тестом и утверждением.

    Например, тест if(index < SIZE) обеспечивает, чтобы index меньше, чем SIZE. Однако утверждение assert(index < SIZE) может завершиться неуспешно, если:

    • Это происходит вне if блок.

    • Перед утверждением необходимо изменить index в if блок.

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

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

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

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

  1. В зависимости от глубины вызова функции и сложности кода, Polyspace иногда может аппроксимировать диапазоны переменных. Из-за аппроксимации программа не может установить, удерживает ли отношение и производит ли оно оранжевую проверку утверждения пользователя.

  2. Выполните динамические тесты для проверки оранжевого цвета, чтобы определить неуспешность утверждения.

    Учебное пособие см. в разделе Проверка оранжевого цвета на наличие ошибок времени выполнения.

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

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

Примечание

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