☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

表达式中的宏参数应该用括号括起来

3.2.5 ID_macro_paramNotEnclosed
目录 › next › previous

编译器对宏参数只做文本替换,不考虑运算符优先级等问题,所以应将宏参数用括号括起来,从而避免意料之外的错误。

示例:

#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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.