exponenta event banner

CERT C: Rec. EXP00-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);
}

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

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

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

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