Invalid use of = operator

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

Описание

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

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

Риск

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

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

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

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

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

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

Примеры

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

#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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: BAD_EQUAL_USE
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 480, 481
Введенный в R2013b