exponenta event banner

Утверждение

Неуспешная инструкция утверждения

Описание

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

Примечание

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

Риск

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

Зафиксировать

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

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

См. примеры исправлений ниже.

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

Примеры

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

#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);
}
Исправление - исправление кода

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

#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. Поликосмическая Ошибка контролер утверждения Finder™ не сигнализирует утверждения с постоянным нулевым параметром, assert(0). Эти типы утверждений обычно используются в качестве динамических проверок во время выполнения. Путем вставки assert(0), вы указываете, что программа не должна достичь этого оператора во время выполнения, в противном случае происходит сбой программы.

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

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

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