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 解析のチューニングを参照してください。