禁用在类之外定义的联合体
5.3.2 ID_forbidNakedUnion
联合体各成员共享存储地址,易引发意料之外的错误。如果一定要使用联合体,需对其进行一定的封装,避免对成员的错误访问。
不应出现:
- 在命名空间作用域内定义的联合体
- 在类中定义的具有 public 访问权限的联合体
示例:
union U { // Non-compliant, global union
....
};
class A {
public:
union { // Non-compliant, public union
....
};
};
class B {
public:
.... // Interfaces about the union
private:
union { // Compliant, the union is under control
....
};
};
类的 public 数据成员本来就违反了封装原则,如果这种数据成员又处于联合体中,会进一步增加风险。
相关
参考
C++ Core Guidelines C.181
MISRA C 2004 18.4
MISRA C 2012 19.2
MISRA C++ 2008 9-5-1