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) и соответствует правилу.

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

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

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

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