ロック解除されていません
ロック解除関数を伴わないロック関数
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、以下の場合に発生します。
タスクはロック関数を呼び出します。
タスクはロック解除関数の呼び出しをせずに終了します。
マルチタスキング コードでは、ロック関数はコードのクリティカル セクションを開始し、ロック解除関数はそれを終了させます。タスク my_task
がロック関数 my_lock
を呼び出すとき、my_lock
を呼び出し中の他のタスクは my_task
が対応するロック解除関数を呼び出すまで待たなくてはなりません。
この欠陥を検出するには、次のいずれかのメソッドを使用してロック関数とロック解除関数を指定します。
Polyspace Bug Finder™ で自動的に検出できるいずれかの同時実行プリミティブ型を呼び出します。Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。
ロック関数およびロック解除関数は、解析前に構成オプションとして明示的に指定します。Polyspace ではロック関数およびロック解除関数の両方が
void func(void)
形式に準拠しなくてはなりません。クリティカル セクション詳細 (-critical-section-begin -critical-section-end)
を参照してください。
間接参照の複数の層を使用してコードで同時実行を実装する場合、Polyspace はこの欠陥を誤って報告する場合があります。
リスク
ロック解除関数は、待機中の他のタスクがクリティカル セクションに入ることができるようにクリティカル セクションを終了させます。ロック解除関数がないと、不必要に長い時間、タスクがブロックされる可能性があります。
修正方法
コードのクリティカル セクション、つまり、Atomic ブロックとして実行するセクションを特定します。セクションの最初で使用したロック関数に対応するロック解除関数をこのセクションの最後で呼び出します。
この欠陥には、他の理由があり、それに対応する修正方法がある場合があります。不適切なロック解除関数を呼び出している可能性もあります。Polyspace 解析構成でロック関数とロック解除関数のペアをチェックして、不一致を修正します。
以下の修正例を参照してください。この問題を回避するには、同じモジュール内のロック関数とロック解除関数を同じ抽象化レベルで呼び出す手法に従うことをお勧めします。次の例の場合、func
はロック関数とロック解除関数を同じレベルで呼び出していますが、func2
はそうではありません。
void func() { my_lock(); { ... } my_unlock(); } void func2() { { my_lock(); ... } my_unlock(); }
問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)。
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
チェッカーの拡張
Polyspace でサポートされていないロック関数またはロック解除関数を使用する場合があります。これらの関数を、POSIX® の既知の同等の関数にマッピングすることで、このチェッカーを拡張します。サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張を参照してください。
例
結果情報
グループ: 同時実行 |
言語: C | C++ |
既定値: オン |
コマンド ライン構文: BAD_LOCK |
影響度: High |
バージョン履歴
R2014b で導入