簡體   English   中英

Findbugs可能會導致誤報?

[英]Probable false positive from Findbugs?

請參考以下代碼片段(將多余的部分切除以突出顯示有問題的情況):

FindBugs抱怨“ 方法不能在所有路徑上釋放鎖定 ”。 這是假陽性嗎? 如果沒有,該如何解決?

  try{
      someLock.lock();
     //do something
    } finally{
      if (someLock.isLocked())
        someLock.unlock();
    }

如果isLocked()拋出異常,那么您就不會解鎖。

我認為isLocked引發異常,但是鎖定時必須解鎖,測試沒有意義。 那么,為什么不使用javadoc中描述的標准模式呢?

someLock.lock();
try{
    //do something
} finally{
    someLock.unlock();
}

所以我說

  • 這是錯誤的肯定,因為您的代碼無法解鎖
  • 在您應該根據建議修復代碼的意義上說,這是一個真正的肯定。

被鎖住了

查詢此鎖是否由任何線程持有。 此方法設計用於監視系統狀態, 而不用於同步控制

如果不是“用於同步控制”,則意味着不能保證isLocked的實現不受爭用條件的影響,即使我們已經獲取了鎖,它也可能返回false。

someLock.lock();
try{      
 //do something
} finally{
  someLock.unlock();
}

要么

boolean locked=false;
try{      
 someLock.lock();
 locked=true;
 //do something
} finally{
  if (locked) someLock.unlock();
}

這看起來像是假陽性,但我想我能理解您為什么得到它。

FindBugs規則最有可能被編碼為檢查所有路徑是否都已unlock ...,無論是否實際需要調用(從鎖定狀態的角度來看)。 它很可能不會嘗試跟蹤鎖的狀態,並且很可能不知道isLocked 含義 盡管您和我isLocked ,如果isLocked返回false ,則不必調用unlock ,但並沒有實現FindBugs規則來進行此推斷。

(實際上,對於FindBugs實現者來說,在各種用例中可靠地進行推理將是一個難題。我們處於“自動定理證明”領域……)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM