EN JP CN

CWARN.COPY.NOASSIGN

CWARN.COPY.NOASSIGN

クラスによって、コピーコンストラクタは定義されていますが、代入演算子は定義されていません

CWARN.COPY.NOASSIGN チェッカーは、コピーコンストラクタを定義し、代入演算子を定義しないクラスを検出します。

脆弱性とリスク

C++ コンパイラによって生成される、デフォルトのコピーコンストラクタと代入演算子は、クラスデータメンバーのビットごとのコピーを行います。メンバーが上書きされると、メモリは適切に破棄されない可能性があります。このような状況により、メモリのリークやリソースが解放されないといった問題につながる可能性があります。

軽減と防止

この問題に対処するには、動的に割り当てられたデータメンバーを含むクラスに対しては常に代入演算子を明示的に実装し、これらのデータメンバーの実質的なコピーが存在するようにします。

脆弱コード例と修正コード例

1  class A      
2  {
3  public:
4      A(const A &other);
5  };
6  
7  class B
8  {
9  public:
10     B(const B &other);
11     B &operator=(const B &other);
12 };
13 
17 class C
18 {
19 public:
20     void f() {}
21 };
34 };

このコード例では、Klocwork は、コピーコンストラクタを定義し、代入演算子を定義しないクラス A にフラグを立てます。一方、クラス B は、コピーコンストラクタと代入演算子の両方を定義しますが、フラグは立てません。