CERT C: Rec. EXP13-C

Относитесь к операторам реляций и равенства, как к неассоциативным

Описание

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

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

Реализация Polyspace

Эта проверка проверяет на Возможно непреднамеренную оценку выражения из-за правил приоритета оператора.

Примеры

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

Проблема

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

Дефект подсвечивает выражения формы x op_1 y op_2 z. Здесь, op_1 и op_2 являются комбинациями операторов, которые обычно вызывают эту ошибку. Для образца, 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 > 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);
}

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

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

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

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