CodeQL 文档

枚举初始化不一致

ID: cpp/irregular-enum-init
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - reliability
   - readability
   - language-features
   - external/jsf
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

此规则查找枚举成员初始化不一致的枚举。只有第一个枚举成员应该使用 ‘=’ 进行初始化,或者所有成员都应该进行初始化。枚举成员初始化不一致很容易导致缺陷,尤其是在添加或删除成员时,或者如果代码依赖于枚举成员的实际整数值时。

建议

更改枚举,使其只有第一个成员进行初始化,或者对所有枚举成员进行初始化。一般来说,如果您确实关心枚举成员的整数值,请对所有枚举成员进行初始化。否则,最好让编译器在编译时分配值。

示例

//wrong: inconsistent initialization, only the first should be initialized, 
//or all should be initialized
enum {
	VALUE_SHOULD_BE_10 = 10,
	VALUE_SHOULD_BE_11,
	VALUE_SHOULD_BE_12,
	VALUE_SHOULD_BE_20, //newly added member, but initialization was forgotten 
	                    //(would have a value of 13 instead of 20).
	VALUE_SHOULD_BE_30 = 30,
	VALUE_SHOULD_BE_40 = 40
} bad_values;

//correct: all enum values initialized
enum {
	VALUE_SHOULD_BE_10 = 10,
	VALUE_SHOULD_BE_11 = 11,
	VALUE_SHOULD_BE_12 = 12,
	VALUE_SHOULD_BE_20 = 20, //newly added member, it is less likely to forget
	                         //putting in initialization since everything else 
	                         //is initialized
	VALUE_SHOULD_BE_30 = 30,
	VALUE_SHOULD_BE_40 = 40
} good_values;

参考资料

  • AV Rule 145,联合攻击战斗机空车 C++ 编码标准。洛克希德·马丁公司,2005 年。

  • MISRA C++ Rule 8-5-3,关键系统中 C++ 语言使用指南。汽车软件可靠性协会,2008 年。

  • MSDN 库:枚举 (C++).

  • ©GitHub, Inc.
  • 条款
  • 隐私