このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
自己代入が演算子でテストされていません
コピー代入演算子で自己代入がテストされない
説明
この欠陥は、オブジェクトのコピー代入演算子の引数がオブジェクト自体かどうかをテストしなかった場合に発生します。Polyspace® は、copy-and-swap イディオムを使用してコピー演算子を実装している場合に、この欠陥を報告しません。
リスク
自己代入は不必要なコピーの原因となります。オブジェクトがそれ自体に代入される可能性は低いものの、エイリアシングのため、ユーザー クラスのユーザーが自己代入を必ず検出できるわけではありません。
データ メンバーがポインターであり、そのポインターにメモリが動的に割り当てられる場合、自己代入は捉えにくいエラーの原因となることがあります。コピー代入演算子では通常、次の手順が実行されます。
ポインターに元々関連付けられていたメモリの割り当てを解除する。
delete ptr;
ポインターに新たなメモリを割り当てる。新たなメモリ位置を、演算子の引数から取得した内容で初期化する。
ptr = new ptrType(*(opArgument.ptr));
演算子の引数 opArgument
がオブジェクト自体である場合、最初の手順が終了しても、演算子の引数にあるポインター データ メンバー opArgument.ptr
はメモリの位置に関連付けられません。*opArgument.ptr
に含まれる値は予測できないものになります。したがって、2 番目の手順では、予測不能な値で新たなメモリ位置が初期化されます。
修正方法
自己代入をユーザー クラスのコピー代入演算子でテストします。コピー代入演算子での代入は、テストが完了してから実行してください。
例
結果情報
グループ: オブジェクト指向 |
言語: C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: MISSING_SELF_ASSIGN_TEST |
影響度: Medium |