exponenta event banner

ISO/IEC TS 17961 [boolasgn]

Нет назначения в условных выражениях

Описание

Определение правила

Нет назначения в условных выражениях. [1 ]

Внедрение Polyspace

Эта проверка проверяет недопустимое использование оператора = (assignment).

Примеры

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

Проблема

Недопустимое использование оператора = происходит, когда назначение выполняется внутри предиката условного, например if или while.

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

Риск
  • Условный оператор проверяет неверные значения - операция с одним знаком равенства присваивает значение правого операнда левому операнду. Затем, поскольку это назначение находится внутри предиката условного, программа проверяет, является ли новое значение левого операнда ненулевым или нет.

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

Зафиксировать
  • Если назначение является ошибкой, для проверки равенства добавьте второй знак равенства (==).

  • Если назначение внутри условного оператора было намеренным, для улучшения читаемости разделите назначение и тест. Переместите назначение за пределы оператора управления. В операторе управления просто проверьте результат присвоения.

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

Пример - единый знак равенства внутри if Состояние
#include <stdio.h>

void bad_equals_ex(int alpha, int beta)
{
    if(alpha = beta)
    {
        printf("Equal\n");
    }
}

Знак равенства помечается как дефект, поскольку оператор назначения используется в предикате оператора if. Предикат присваивает значение beta кому alpha, затем неявно проверяет, alpha true или false.

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

Одной из возможных корректировок является добавление дополнительного знака равенства. Эта коррекция изменяет назначение на сравнение. Условие if сравнивает alpha и beta равны.

#include <stdio.h>

void equality_test(int alpha, int beta)
{
    if(alpha == beta)
    {
        printf("Equal\n");
    }
}
Коррекция - назначение и сравнение внутри if Состояние

Если назначение должно быть выполнено внутри предиката, возможной поправкой является добавление явного сравнения. Эта поправка присваивает значение beta кому alpha, затем явно проверяет, alpha ненулевое. Код четче.

#include <stdio.h>

int assignment_not_zero(int alpha, int beta)
{
    if((alpha = beta) != 0)
    {
        return alpha;
    }
    else
    {
        return 0;
    }
}
Коррекция - Перемещение назначения за пределы if Заявление

Если присвоение может быть выполнено вне оператора управления, одной из возможных корректировок является разделение присвоения и сравнения. Эта поправка присваивает значение beta кому alpha до if. Внутри условия if, только alpha передается для проверки, если alpha не равно нулю или не равно NULL.

#include <stdio.h>

void assign_and_print(int alpha, int beta)
{
    alpha = beta;
    if(alpha)
    {
        printf("%d", alpha);
    }
}

Проверить информацию

Разрешимость: Разрешимая
Представлен в R2019a

[1] Выдержки из стандарта «ISO/IEC TS 17961 Technical Specification - 2013-11-15» воспроизводятся с согласия AFNOR. Нормативную ценность имеет только оригинальный и полный текст стандарта, опубликованный изданиями AFNOR - доступный через веб-сайт www.boutique.afnor.org.