Assertion

Не удалось выполнить оператор утверждения

Описание

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

Примечание

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

Риск

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

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

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

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

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

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

Примеры

расширить все

#include <assert.h>

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

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

Коррекция - Изменить выражение Assert

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

#include <assert.h>

void asserting_x(unsigned int theta) {
    theta =+ 5;
    assert(theta > 0);
}
Коррекция - Исправление кода

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

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

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

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