Assertion

Не пройдено оператор контроля

Описание

Этот дефект происходит, когда вы используете assert, и утверждаемое выражение или могло быть ложным.

Примечание

Polyspace® не делает флага assert(0) как утверждение дезертируют, потому что эти операторы обычно используются, чтобы отключить определенные разделы кода.

Риск

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

Фиксация

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

Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже.

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

Примеры

развернуть все

#include <assert.h>

void asserting_x(unsigned int theta) {
    theta =+ 5;
    assert(theta < 0);
}

В этом примере, assert функционируйте проверки если входная переменная, theta, меньше чем или равно нулю. Утверждение перестало работать потому что theta беззнаковое целое, таким образом, значение в начале функции является, по крайней мере, нулем. += оператор увеличивает это положительное значение пять. Поэтому область значений theta [5..MAX_INT]. theta всегда больше нуля.

Коррекция — изменение утверждает выражение

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

#include <assert.h>

void asserting_x(unsigned int theta) {
    theta =+ 5;
    assert(theta > 0);
}
Коррекция — фиксирует код

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

#include <assert.h>
#include <stdlib.h>

void asserting_x(int theta) {
    theta = -abs(theta);
    assert(theta < 0);
}
#include <assert.h>

#define FLAG 0

int main(void){
    int i_test_z = 0;
    float f_test_z = (float)i_test_z;

    assert(i_test_z);
    assert(f_test_z);
    assert(FLAG);

    return 0;
}

В этом примере Polyspace не делает флага assert(FLAG) как нарушение, потому что макрос задает FLAG как 0. Верификатор условий Polyspace Bug Finder™ не отмечает утверждения с помощью постоянного нулевого параметра, assert(0). Эти типы утверждений обычно используются в качестве динамических проверок во время времени выполнения. Путем вставки assert(0), вы указываете, что программа не должна достигать этого оператора в течение времени выполнения, в противном случае катастрофические отказы программы.

Однако верификатор условий действительно отмечает отказавшие утверждения, вызванные равным нулю значением переменных, как замечено в примере с assert(i_test_z) и assert(f_test_z).

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: On
Синтаксис командной строки: ASSERT
Удар: высоко
Введенный в R2013b