EN JP CN

CL.SELF-ASSIGN

CL.SELF-ASSIGN

自己代入チェックの欠落による解放されたメモリの解放

これは演算子 = での自己への代入の可能性を通知するクラスレベル (CL) のチェッカーです。クラスレベルのチェッカーは有効な C++ のための Scott Meyer 規則クラス構築に基づいて推奨を通知します。

脆弱性とリスク

代入演算子内部での自己代入はメンバーデータの破壊につながる可能性があります。動的に割り当てられたメンバーデータは、そのような代入が生じた場合に、特に、うっかりして削除されたり喪失したりする可能性があります。

脆弱コード例 1

1  class Pencil {
2  };
3  class Box {
4  public:
5      Box& operator=(const Box& rhs) {
6          count = rhs.count;
7          delete x;
8          x = new Pencil(*rhs.x);
9      }
10 private:
11    int count;
12    Pencil *x;
13 };

この例では、演算子 = 内部で自己代入のチェックがされていません。自己代入が生じると、7 行目の delete 演算子はパラメーター'rhs' (これは 'this' のエイリアスとして動作します) からのメンバー'x' を削除します。その結果、8 行目のコピーコンストラクタで使用されているメモリを破壊することになります。

修正コード例 1

1  class Pencil {
2  };
3  class Box {
4  public:
5      Box& operator=(const Box& rhs) {
6          if (this==&rhs) return *this;
7          count = rhs.count;
8          delete x;
9          x = new Pencil(*rhs.x);
10      }
11 private:
12    int count;
12    Pencil *x;
14 };

修正例では、6 行目で自己への代入のチェックが行われます。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。