Макрос содержит аргументы, которые можно вычислять несколько раз или не вычислять
Этот дефект возникает при вызове небезопасного макроса с выражением, имеющим побочный эффект.
Небезопасный макрос: при развертывании небезопасный макрос несколько раз оценивает свои аргументы или вообще не оценивает их.
Например, ABS макрос вычисляет свой аргумент x дважды.
#define ABS(x) (((x) < 0) ? -(x) : (x))
Побочный эффект: При вычислении выражение с побочным эффектом изменяет хотя бы одну из переменных в выражении.
Например, ++n изменяет n, но n+1 не изменяет n.
Проверка не учитывает побочные эффекты во вложенных макросах. Средство проверки также не рассматривает вызовы функций или изменчивый доступ к переменным как побочные эффекты.
При вызове небезопасного макроса с выражением, имеющим побочный эффект, выражение вычисляется несколько раз или вообще не вычисляется. Побочный эффект может возникать несколько раз или вообще не возникать, вызывая неожиданное поведение.
Например, в вызове MACRO(++n), ожидается только одно приращение переменной n. Если MACRO является небезопасным макросом, приращение происходит несколько раз или вообще не происходит.
Средство проверки помечает выражения с побочными эффектами в assert макро, потому что assert макрос отключен в режиме, отличном от отладки. Для компиляции в режиме, отличном от отладки, необходимо определить NDEBUG во время компиляции. Например, в GCC используется флаг -DNDEBUG.
Вычислите выражение с побочным эффектом в отдельном операторе, а затем используйте результат в качестве аргумента макроса.
Например, вместо:
MACRO(++n);
++n; MACRO(n);
В качестве побочного эффекта средство проверки рассматривает изменения локальной переменной, определенной только в области блока тела макроса. Этот дефект не может произойти, так как переменная видна только в теле макроса. Если вы видите дефект такого рода, игнорируйте дефект.
| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
SIDE_EFFECT_IN_UNSAFE_MACRO_ARG |
| Воздействие: среднее |
Find defects (-checkers) | MISRA C:2012 Rule 13.2 | MISRA C:2012 Rule 13.3 | MISRA C:2012 Rule 13.4 | Side effect of expression ignored | Stream argument with possibly unintended side effects