Macro terminated with a semicolon

Определение макроса заканчивается точкой с запятой

Описание

Этот дефект возникает, когда макрос, который вызывается по крайней мере один раз, имеет определение, заканчивающееся точкой с запятой.

Риск

Если определение макроса заканчивается точкой с запятой, расширение макроса может привести к непреднамеренной программной логике в определенных контекстах, таких как выражение.

Например, рассмотрим макрос:

#define INC_BY_ONE(x) ++x;
Если используется в выражении:
res = INC_BY_ONE(x)%2;
выражение разрешается в:
res = ++x; %2;
Значение x+1 назначается res, что, вероятно, непреднамеренно. Левый автономный оператор %2; является действительным кодом С и может быть обнаружен только путем включения строгих предупреждений компилятора.

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

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

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

Примеры

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

#define WHILE_LOOP(n) while(n>0);

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

В этом примере дефект возникает из-за определения макроса WHILE_LOOP(n) заканчивается точкой с запятой. В результате создания точки с запятой while цикл имеет пустое тело и последующие операторы в прогоне блоков только один раз. Вероятно, предполагалось, что цикл должен повторить 100 раз.

Коррекция - удалить точку с запятой из определения макроса

Удалите конечную точку с запятой из определения макроса. Пользователи макроса могут при необходимости добавить точку с запятой после макроса. В этом примере точка с запятой не требуется.

#define WHILE_LOOP(n) while(n>0)

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

Информация о результатах

Группа: Хорошая практика
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : SEMICOLON_TERMINATED_MACRO
Влияние: Низкое
Введенный в R2020a