Макрос содержит аргументы, которые можно оценить несколько раз или не оценить
Этот дефект возникает, когда вы вызываете небезопасный макрос с выражением, которое имеет побочный эффект.
Небезопасный макрос: При расширении небезопасный макрос оценивает свои аргументы несколько раз или вообще не оценивает свой аргумент.
Для образца, ABS
macro оценивает его аргумент 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++ |
По умолчанию: Off |
Синтаксис командной строки
: 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