CERT C: Rule EXP45-C

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

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

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

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

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

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

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

    Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты 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.

Коррекция - изменение выражения на сравнение

Одной из возможных коррекций является добавление дополнительного знака равенства. Эта коррекция изменяет присвоение на сравнение. Условие 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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