CERT C++: EXP45-C

Не выполняйте присвоения в операторах выбора

Описание

Управляйте определением

Не выполняйте присвоения в выборе statements.[1]

Реализация Polyspace

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

Примеры

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

Проблема

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

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

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

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

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

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

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

Пример - один знак "равно" в if Условие
#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);
    }
}

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

Группа: 02. Выражения (EXP)
Введенный в R2019a

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА БАЗИСЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.