CL.SELF-ASSIGN
由于缺少自赋值检查而释放已释放的内存
这是一个类级别 (CL) 检查器,可告知运算符 = 中潜在的自赋值情况。类级别检查器会根据 Scott Meyer 的高效 C++ 规则类构造来生成建议。
漏洞与风险
赋值运算符中的自赋值可能导致成员数据损坏。发生此类赋值时,动态分配的成员数据尤其可能被无意删除或丢失。
漏洞代码示例 1
复制
class Pencil {
};
class Box {
public:
Box& operator=(const Box& rhs) {
count = rhs.count;
delete x;
x = new Pencil(*rhs.x);
}
private:
int count;
Pencil *x;
};
在此示例中,未对运算符 = 中是否存在自赋值进行检查。如果发生自赋值,第 7 行的 delete 运算符会从参数 rhs(作为 this 的别名进行操作)中删除成员 x,导致第 8 行复制构造函数中使用的内存损坏。
修正代码示例 1
复制
class Pencil {
};
class Box {
public:
Box& operator=(const Box& rhs) {
if (this==&rhs) return *this;
count = rhs.count;
delete x;
x = new Pencil(*rhs.x);
}
private:
int count;
Pencil *x;
};
在该修正代码示例中,第 6 行已进行自赋值检查。
相关检查器
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。