表达式中的宏参数应该用括号括起来
3.2.5 ID_macro_paramNotEnclosed
编译器对宏参数只做文本替换,不考虑运算符优先级等问题,所以应将宏参数用括号括起来,从而避免意料之外的错误。
示例:
#define SUM(a, b) (a + b) // Non-compliant
设 x 为变量,如果按如下方式使用宏:
x = SUM(x, x << 1);
则相当于:
x = x + x << 1;
注意,+ 的优选级高于 <<,结果为 (2 * x) << 1,这往往是不符合预期的。
应改为:
#define SUM(a, b) ((a) + (b)) // Compliant
依据
ISO/IEC 9899:1999 6.10.3.5(4)
ISO/IEC 9899:2011 6.10.3.5(4)
参考
CWE-783
MISRA C 2004 19.10
MISRA C 2012 20.7
MISRA C++ 2008 16-0-6
SEI CERT PRE01-C