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

不应对枚举对象声明位域

6.9.4 ID_forbidEnumBitfield
目录 › next › previous

枚举类型的底层整数类型以及是否存在符号位由实现定义,与位域结合易导致意料之外的错误。

示例:

enum E {
    A, B, C, D
};

struct X {
    E e: 2;   // Non-compliant
};

int main() {
    X x;
    x.e = D;
    if (x.e == D) {    // What is output?
        cout << "OK";
    } else {
        cout << "Oops";
    }
}

可能输出 Oops。例中枚举项的取值范围是 [0, 3],位域长度为 2 即可满足这个范围,但如果位域有符号位,会导致意料之外的问题,如用 D 对 x.e 赋值,但 x.e == D 的结果却是 false (因为 D 的值为 3 而 x.e 的值为 -1)。

例外:

enum E: unsigned {   // Explicit underlying type
    A, B, C, D
};

struct X {
    E e: 2;   // Compliant
};

在遵循 C++11 及之后标准的代码中,如果显式指定了枚举类型的的底层类型,可不受本规则限制。

相关

ID_improperBitfieldType ID_singleSignedBitfield

依据

ISO/IEC 9899:1999 6.7.2.2(4)-implementation ISO/IEC 9899:2011 6.7.2.2(4)-implementation ISO/IEC 14882:2011 7.2(6)-implementation ISO/IEC 14882:2017 10.2(7)-implementation

参考

MISRA C++ 2008 9-6-3
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.