CWARN.COPY.NOASSIGN

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

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

脆弱性とリスク

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

軽減と防止

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

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

コピー
  class A      
  {
  public
      A(const A &other);
  };
  
  class B
  {
  public
     B(const B &other);
     B &operator=(const B &other);
 };
 
 class C
 {
 public
     void f() {}
 };

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