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 は、コピーコンストラクタと代入演算子の両方を定義しますが、フラグは立てません。