Выполните один или несколько из этих шагов, пока не определите исправление для проверки утверждения пользователя. Существует несколько способов исправления этой проверки. Описание проверки и примеры кода см. в разделе User assertion.
Иногда, особенно для оранжевой проверки, можно определить, что проверка представляет собой не реальную ошибку, а предположение Polyspace ®, которое не соответствует вашему коду. Если для смягчения предположения можно использовать опцию анализа, повторно запустите проверку с помощью этой опции. В противном случае в результат или код можно добавить комментарий и обоснование.
Общий рабочий процесс, применяемый ко всем проверкам, см. в разделе Интерпретация результатов проверки кода в пользовательском интерфейсе Polyspace Desktop.
Как использовать этот чек: Обычно вы используете assert операторы во время отладки, чтобы проверить, удовлетворяется ли условие в текущей точке кода. Например, если требуется переменная var чтобы иметь значения в диапазоне [1,10] в определенный момент в коде следует поместить следующую инструкцию:
assert(var >=1 && var <= 10);
Поэтому можно разумно вставить assert операторы, которые проверяют требования из вашего кода.
Красный результат проверки утверждения пользователя указывает на то, что требование определенно не выполнено.
Оранжевый результат проверки утверждения пользователя указывает на то, что требование, возможно, не выполнено.
Трассировка потока данных для каждой переменной, задействованной в 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 можно выполнить только следующие действия.
| Переменная | Поиск предыдущих экземпляров переменной |
|---|---|
Локальная переменная | Используйте один из следующих методов.
|
Глобальная переменная Щелкните правой кнопкой мыши переменную. Если отображается опция Показать в представлении доступа к переменной, переменная является глобальной переменной. |
|
Возвращаемое значение функции
ret=func(); |
|
Можно также определить, связаны ли переменные в какой-либо операции с какой-либо предыдущей операцией. См. раздел Поиск связей между переменными в коде.
Если проверка имеет оранжевый цвет и выполняется в функции, проверьте, вызывается ли функция несколько раз. Определите, будет ли утверждение неуспешным только при определенных вызовах. Для этих вызовов перейдите к телу вызывающего абонента и проверьте наличие тестов, обеспечивающих выполнение требований к утверждению.
Для просмотра вызывающих абонентов функции выберите имя функции на панели «Источник». Все вызывающие абоненты отображаются на панели «Иерархия вызовов». Выберите имя вызывающего абонента для перехода к нему в источнике.
Чтобы определить, вызывает ли подмножество вызовов проверку оранжевого цвета, используйте опцию Sensitivity context (-context-sensitivity). Учебное пособие см. в разделе Идентификация вызова функции с ошибкой времени выполнения.
Если имеются тесты, обеспечивающие выполнение требования утверждения, см.:
Утверждение входит в объем испытаний.
Переменные теста изменяются между тестом и утверждением.
Например, тест if(index < SIZE) обеспечивает, чтобы index меньше, чем SIZE. Однако утверждение assert(index < SIZE) может завершиться неуспешно, если:
Это происходит вне if блок.
Перед утверждением необходимо изменить index в if блок.
Возможное исправление: Внимательно подумайте, должны ли вы соответствовать требованиям к утверждению. Если необходимо выполнить эти требования, разместите тесты, обеспечивающие выполнение требований. После тестирования не изменяйте переменные теста.
Проверьте, можно ли отследить оранжевый чек по предположению Polyspace, которое встречается ранее в коде. Если предположение не соответствует действительности в вашем случае, добавьте комментарий или обоснование в результат или код. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.
Например, после вызова функции устанавливается связь между двумя переменными. Затем:
В зависимости от глубины вызова функции и сложности кода, Polyspace иногда может аппроксимировать диапазоны переменных. Из-за аппроксимации программа не может установить, удерживает ли отношение и производит ли оно оранжевую проверку утверждения пользователя.
Выполните динамические тесты для проверки оранжевого цвета, чтобы определить неуспешность утверждения.
Учебное пособие см. в разделе Проверка оранжевого цвета на наличие ошибок времени выполнения.
Попробуйте уменьшить сложность кода и повторно запустите проверку. В противном случае добавьте в результат или код комментарий и обоснование с описанием причин, по которым код не был изменен.
Дополнительные сведения см. в разделе Допущения анализа проверки кода.
Примечание
Прежде чем обосновывать проверку оранжевого цвета, тщательно продумайте, можно ли улучшить дизайн кода.