Deadlock
ロック関数の呼び出し順による 2 つのタスクの相互ブロック
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、以下の理由で、複数のタスクがクリティカル セクション (CS) にスタックされた場合に発生します。
各 CS は別の CS が終了するのを待機します。
クリティカル セクション (CS) は循環を形成します。以下に例を示します。
CS #1 は CS #2 が終了するのを待機し、CS #2 は CS #1が終了するのを待機します。
CS #1 は CS #2 が終了するのを待機し、CS #2 は CS #3 が終了するのを待機し、CS #3 は CS #1 が終了するのを待機します。
Polyspace はコードのクリティカル セクションが指定された形式に準拠すると想定します。クリティカル セクションはロック関数およびロック解除関数の呼び出しの間に置かれています。タスク my_task がロック関数 my_lock を呼び出すとき、my_lock を呼び出し中の他のタスクは my_task が対応するロック解除関数を呼び出すまで待たなくてはなりません。
この欠陥を検出するには、次のいずれかのメソッドを使用してロック関数とロック解除関数を指定します。
Polyspace Bug Finder™ で自動的に検出できるいずれかの同時実行プリミティブ型を呼び出します。Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。
ロック関数およびロック解除関数は、解析前に構成オプションとして明示的に指定します。Polyspace ではロック関数およびロック解除関数の両方が
void func(void)形式に準拠しなくてはなりません。クリティカル セクション詳細 (-critical-section-begin -critical-section-end)を参照してください。
リスク
各タスクは、別のタスクのクリティカル セクションが終了するのを待機しているため続行できません。このプログラムはいつまでもフリーズし続ける可能性があります。
修正方法
修正方法は欠陥の根本原因によって異なります。次のいずれかの方法で、タスク間の周期的な順序の中断を試みることができます。
特定のシーケンスにおけるデッドロックに関連するすべてのクリティカル セクションを書き出します。タスク内でクリティカル セクションのロック関数を呼び出す場合は常に、そのシーケンス内の順序に従います。以下の例を参照してください。
デッドロックに関連するいずれかのクリティカル セクションが割り込みで発生する場合、すべてのタスクのクリティカル セクションの間、すべての割り込みの無効化を試みます。
すべての割り込みを無効にする (-routine-disable-interrupts -routine-enable-interrupts)を参照してください。
この欠陥のレビューは、クリティカル セクションでのすべての操作が本当にAtomic ブロックとしての実行を意図しているかどうかをチェックする機会になります。クリティカル セクションは必要最小限に留めることをお勧めします。
問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)。
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
チェッカーの拡張
Polyspace ではサポートされていないマルチスレッド関数を使用する場合があります。その場合、マルチスレッド関数の各関数を、それぞれに対応する既知の POSIX® 関数にマッピングすることで、このチェッカーを拡張します。サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張を参照してください。
例
結果情報
| グループ: 同時実行 |
| 言語: C | C++ |
| 既定値: オン |
コマンド ライン構文: DEADLOCK |
| 影響度: High |
バージョン履歴
R2014b で導入
