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