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

Присвоение в условном операторе

Описание

Invalid use of = operator происходит, когда присвоение сделано в предикате условного выражения, такого как if или while.

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

Риск

  • Условный оператор тестирует неправильные значения — одна операция знака "равно" присваивает значение правильного операнда к левому операнду. Затем потому что это присвоение в предикате условного выражения, проверки программы, является ли новое значение левого операнда ненулевым или не ПУСТЫМ.

  • Обслуживание и проблемы удобочитаемости — Даже если присвоение предназначается, кто-то чтение или обновление кода, могут неправильно истолковать присвоение как сравнение равенства вместо присвоения.

Фиксация

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

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

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

Примеры

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

#include <stdio.h>

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

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

Исправление — выражение изменения к сравнению

Одно возможное исправление добавляет дополнительный знак "равно". Это исправление изменяет присвоение на сравнение. Если условие выдерживает сравнение, равны ли 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 перед если. В если-условии только alpha дан тесту, если alpha является ненулевым или не ПУСТЫМ.

#include <stdio.h>

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

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

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

Введенный в R2013b