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

由多个语句组成的宏定义应该用 do-while(0) 括起来

3.2.6 ID_macro_stmtNotEnclosed
目录 › next › previous

由多个语句组成的宏定义应该用“do {”和“} while(0)”括起来,从而避免意料之外的错误。

示例:

#define SWAP(a, b)\
    a ^= b; b ^= a; a ^= b   // Non-compliant

如果按如下方式使用宏:

if (x > y)
    SWAP(x, y);

展开后 b ^= a; a ^= b; 不在 if 语句的范围内,应改为:

#define SWAP(a, b) {\          // Compliant
    a ^= b; b ^= a; a ^= b;\
}

更进一步地,建议使用 do-while(0) 结构:

#define SWAP(a, b) do {\       // Good
    a ^= b; b ^= a; a ^= b;\
} while(0)

这样在使用宏时必须以分号结尾,否则无法通过编译,使宏在使用风格上与函数相同,便于阅读。

相关

ID_if_scope ID_while_scope ID_for_scope

依据

ISO/IEC 9899:1999 6.10.3.5(4) ISO/IEC 9899:2011 6.10.3.5(4)

参考

CWE-483 SEI CERT PRE10-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.