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

非 POD 类型的指针与基本类型的指针不应相互转换

12.11 ID_nonPODBinaryCast
目录 › next › previous

非“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 函数从文件中读取对象便破坏了运行时数据。

相关

ID_nonPODFilling

参考

CWE-843
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.