Просмотр и исправление проверок Assertion пользователя

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

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

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

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

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

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

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

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

Шаг 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. Выберите Go To Line. Введите номер линии.

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

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

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

Шаг 2: Проверьте общие причины проверки

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

    • Чтобы увидеть вызывающих абонентов функции, выберите имя функции на панели Source. Все вызывающие абоненты отображаются на панели Call Hierarchy. Выберите имя вызывающего абонента для перехода к нему в источнике.

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

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

    • Оценка оператора находится в возможностях тестов.

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

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

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

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

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

Шаг 3: Проверка трассировки на допущение Polyspace

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

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

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

  2. Запустите динамические тесты на оранжевой проверке, чтобы определить, не удается ли выполнить проверку типа «assertion».

    Для получения руководства «Тестирование Orange Checks на ошибки времени выполнения».

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

Для получения дополнительной информации смотрите Допущения анализа Code Prover.

Примечание

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