exponenta event banner

Недопустимое использование оператора =

Назначение в условном операторе

Описание

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

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

Риск

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

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

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

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

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

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

Примеры

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

#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);
    }
}

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

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