exponenta event banner

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

Не выполнять назначения в инструкциях выбора

Описание

Определение правила

Не выполнять назначения в инструкциях выбора. [1 ]

Внедрение Polyspace

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

Примеры

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

Проблема

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

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

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

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

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

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

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

Пример - единый знак равенства внутри if Состояние
#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);
    }
}

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

Группа: Правило 03. Выражения (EXP)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.