CERT.MEM.SMART_PTR.OWNED
ポインター値 '{0}' が既に所有されている
同じポインターオブジェクトの所有権が 2 つの異なるスマートポインターオブジェクトによって取得される場合、欠陥が報告されます。
脆弱性とリスク
メモリを 2 回削除しようとすると、未定義の動作となって、プログラムのメモリ管理データが破損する可能性があり、その結果、悪意のあるユーザーが、保護されているアドレスから値を読み取ったり、書き込んだりできるようになります。
脆弱コード例
コピー
#include <memory>
void foo () {
int * p = new int;
std::unique_ptr<int> ptr1(p);
std::unique_ptr<int> ptr2(p);
}
Klocwork で 5 行目について欠陥 CERT.MEM.SMART_PTR.OWNED が報告され、「ポインター値 'p' が既に所有されている」ことが示されます。 ポインター 'p' は 4 行目でスマートポインター 'ptr1' のコンストラクターに渡されるため、その有効期間が 'ptr1' によって管理されるようになります。 5 行目で 'ptr2' のコンストラクターに 'p' が渡されると、2 つの別個のスマートポインターオブジェクトによって単一のリソースが管理されることになります。
修正コード例
コピー
#include <memory>
void foo () {
int * p = new int;
std::unique_ptr<int> ptr1(p);
ptr1.release ();
std::unique_ptr<int> ptr2(p);
}
7 行目の 'ptr1.release()' の呼び出しにより、'p' がポイントするリソースが 'ptr1' によって管理されなくなります。
外部参考資料
拡張機能
MSPO.ACQ 属性を API に追加して、スマートポインターの所有権を取得し、ソースおよびシンクとして機能させることができます。 MSPO.REL 属性を API に追加して、ポイント先のオブジェクトの有効期間がスマートポインターによって制御されないようにすることができます。