exponenta event banner

CERT C: Rec. PRE01-C

Использовать круглые скобки в макросах вокруг имен параметров

Описание

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

Используйте круглые скобки в макросах вокруг имен параметров. [1 ]

Внедрение Polyspace

Эта проверка проверяет параметры макросов, не заключенные в круглые скобки.

Примеры

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

Проблема

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

Если параметр макроса не содержит выражения, то круглые скобки не требуются.

Риск

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

Зафиксировать

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

Пример - Макро-выражения
#define mac1(x, y) (x * y)
#define mac2(x, y) ((x) * (y))

void foo(void){
    int r;

    r = mac1(1 + 2, 3 + 4);       /* Non-compliant */
    r = mac1((1 + 2), (3 + 4));   /* Compliant */

    r = mac2(1 + 2, 3 + 4);       /* Compliant */
}

В этом примере: mac1 и mac2 - макросы, предположительно реализующие одно и то же определение.

  • Определение mac1 не заключает параметры макроса в скобки. В несоответствующем выражении макрос расширяется до r = (1 + 2 * 3 + 4); Предполагаемое выражение может быть (1 + (2 * 3) + 4) или (1 + 2) * (3 + 4). Однако без скобок разработчик или рецензент кода может не знать намерения выражения. Последующее совместимое выражение заключает параметры макроса в скобки, так что предполагаемое расширение макроса ясно (1 + 2) * (3 + 4).

  • Определение mac2 заключает параметры в круглые скобки. Выражение, включающее mac2 расширяется до (1 + 2) * (3 + 4) и соблюдает правило.

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

Группа: Rec. 01. Препроцессор (PRE)
Представлен в R2019a

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

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

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