このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
スレッド固有のメモリ リーク
スレッドの終了前に解放されていない動的に割り当てられたスレッド固有のメモリ
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、動的に割り当てられたスレッド固有のメモリをスレッドの終了前に開放しなかった場合に発生します。
スレッド固有のストレージを作成するには、通常、以下の手順を行います。
スレッド固有のストレージのキーを作成する。
スレッドを作成する。
各スレッドで、ストレージを動的に割り当ててから、このストレージとキーを関連付ける。
関連付けたら、格納されたデータはキーを使用して後から読み取ることができます。
スレッドの終了前に、キーを使用してスレッド固有のメモリを解放する。
チェッカーは、最後の手順が不足しているスレッドの実行パスにフラグを設定します。
チェッカーは、以下の関数のファミリに対して機能します。
tss_get
およびtss_set
(C11)pthread_getspecific
およびpthread_setspecific
(POSIX)
リスク
メモリに格納されたデータは、スレッドの終了後も他のプロセスから利用できます (メモリ リーク)。メモリ リークはセキュリティの脆弱性になるだけでなく、使用可能なメモリの量を縮小し、パフォーマンスを低下させる可能性があります。
修正方法
スレッドの終了前に動的に割り当てられたメモリを解放します。
動的に割り当てられたメモリは、free
などの関数を使用して明示的に開放できます。
または、キーを作成するときにデストラクター関数とキーを関連付けることができます。デストラクター関数は、キー値を引数に指定してスレッドの最後に呼び出されます。デストラクター関数の本体で、キーに関連付けられたメモリを解放することができます。この方法を使用している場合でも、Bug Finder は欠陥にフラグを設定します。適切なコメントを使用してこの欠陥は無視します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
例
結果情報
グループ: 同時実行 |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: THREAD_MEM_LEAK |
影響度: Medium |
バージョン履歴
R2018b で導入