CERT C: Rec. EXP13-C

Обработайте операторы отношения и операторы равенства, как будто они были неассоциативны

Описание

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

Обработайте операторы отношения и операторы равенства, как будто они были неассоциативны. [1]

Примеры

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

Описание

Возможно непреднамеренная оценка выражения из-за правил приоритета оператора происходит, когда результат арифметического выражения возможно непреднамерен, потому что правила приоритета оператора диктуют порядок оценки, что вы не ожидаете.

Дефект подсвечивает выражения формы x op_1 y op_2 z. Здесь, op_1 и op_2 являются комбинациями оператора, которые обычно вызывают эту ошибку. Например, x == y | z.

Средство проверки не отмечает все комбинации оператора. Например, x == y || z не отмечается, потому что вы, скорее всего, намеревались выполнить логический OR между x == y и z. А именно, средство проверки отмечает эти комбинации:

  • && и ||: Например, x || y && z или x && y || z.

  • Присвоение и битовые операции: Например, x = y | z.

  • Присвоение и операции сравнения: Например, x = y != z или x = y > z.

  • Операции сравнения: Например, x > y > z (кроме тех случаев, когда одно из сравнений является равенством x == y > z).

  • Сдвиг и числовая операция: Например, x << y + 2.

  • Указатель разыменовывает и арифметика: Например, *p++.

Риск

Дефект может вызвать следующие проблемы:

  • Если вы или другой рецензент кода рассматриваете код, намеченный порядок оценки не сразу понятен.

  • Возможно, что результат оценки не оправдывает ваши надежды. Например:

    • В операции *p++ возможно, что вы ожидаете, что разыменованное значение будет постепенно увеличено. Однако указатель p постепенно увеличивается перед разыменовыванием.

    • В операции (x == y | z) возможно, что вы ожидаете, что x будет по сравнению с y | z. Однако операция == происходит перед операцией |.

Фиксация

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

Для лучшей удобочитаемости вашего кода это - хорошая практика, чтобы применить круглую скобку, чтобы реализовать порядок оценки, даже когда правила приоритета оператора налагают тот порядок.

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

int test(int a, int b, int c) {
    return(a & b == c);
}

В этом примере операция == происходит сначала, сопровождаемая операцией &. Если вы предназначили обратный порядок операций, результат не то, что вы ожидаете.

Исправление — круглая скобка для намеченного порядка

Одно возможное исправление должно применить круглую скобку, чтобы реализовать намеченный порядок оценки.

int test(int a, int b, int c) {
    return((a & b) == c);
}

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

Группа: Rec. 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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