JD.LOCK
JD.LOCK は、java.util.concurrent.locks.Lock.lock() メソッドの呼び出しでロックが獲得された後、解除されていない場合に発生します。すなわち、java.util.concurrent.locks.Lock.unlock() メソッドがいずれかのパスで呼び出されていません。
脆弱性とリスク
この状況はデッドロックの原因となる可能性があります。
軽減と防止
Lock オブジェクトでロックを実装するパターンを以下に示します。
l.lock(); try { ... } finally { l.unlock(); }
例 1
コピー
void action() {
Lock l = new ReentrantLock();
l.lock();
try {
dosomething();
} catch (Exception e) {
l.unlock();
}
}
private void dosomething() throws Exception {
// ...
}
JD.LOCK が 13 行目に対して報告されています。ロック 'l' が獲得されましたが、解除されていません。
例 2
コピー
void action() {
Lock l = new ReentrantLock();
l.lock();
try {
dosomething();
} catch (Exception e) {
// ...
} finally {
l.unlock();
}
}
private void dosomething() throws Exception {
// ...
}
例 1 のスニペットの問題を修正しました:ロックは、例外がスローされたかどうかにはかかわらず解除されます。フィールドは、JD.LOCK は報告されていません。
外部参考資料
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。