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 行已进行自赋值检查。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。