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 に追加して、ポイント先のオブジェクトの有効期間がスマートポインターによって制御されないようにすることができます。