非 POD 类型的指针与基本类型的指针不应相互转换
12.11 ID_nonPODBinaryCast
非“POD 类型”相关数据之间存在特殊的内在关系,尤其是虚函数表指针、虚基类表指针这种由实现定义的运行时数据,不应当作普通二进制数据处理,非 POD 类型的指针也不应与 void*、unsigned char* 等基本类型的指针相互转换。
示例:
class A {
....
public:
virtual ~A() = 0;
void save() const {
FILE* fp = fopen("dat", "wb");
fwrite(this, sizeof(A), 1, fp); // Non-compliant
fclose(fp);
}
void load() {
FILE* fp = fopen("dat", "rb");
fread(this, sizeof(A), 1, fp); // Non-compliant
fclose(fp);
}
};
例中 A 是多态类型,save 函数将对象写入文件,fwrite 的第一个参数 this 被隐式转为 void*,不符合本规则要求。对象的虚表指针等数据一并被写入文件,但虚表指针是运行时数据不应被保存,load 函数从文件中读取对象便破坏了运行时数据。