ロックの欠落
ロック関数を伴わないロック解除関数
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、タスクが対応するロック関数を呼び出す前にロック解除関数を呼び出した場合に発生します。
マルチタスキング コードでは、ロック関数はコードのクリティカル セクションを開始し、ロック解除関数はそれを終了させます。タスク my_task
がロック関数 my_lock
を呼び出すとき、my_lock
を呼び出し中の他のタスクは my_task
が対応するロック解除関数を呼び出すまで待たなくてはなりません。Polyspace はロック、ロック解除関数両方が void func(void)
形式になるまで待機しなくてはなりません。
この欠陥を検出するには、次のいずれかのメソッドを使用してロック関数とロック解除関数を指定します。
Polyspace Bug Finder™ で自動的に検出できるいずれかの同時実行プリミティブ型を呼び出します。Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。
ロック関数およびロック解除関数は、解析前に構成オプションとして明示的に指定します。Polyspace ではロック関数およびロック解除関数の両方が
void func(void)
形式に準拠しなくてはなりません。クリティカル セクション詳細 (-critical-section-begin -critical-section-end)
を参照してください。
リスク
対応するロック関数がないロック解除関数の呼び出しは、コーディング エラーを示す可能性があります。たとえば、ロック解除関数が、クリティカル セクションを開始するロック関数に対応していないことが考えられます。
修正方法
修正方法は欠陥の根本原因によって異なります。たとえば、ロック関数とロック解除関数の不一致が原因で欠陥が発生している場合は、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_UNLOCK |
影響度: Medium |
バージョン履歴
R2014b で導入