CERT C: правило EXP45-C

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

Описание

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

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

Примеры

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

Описание

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

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

Группа: правило 03. Выражения (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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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