2011-03-16 14 views
5

您好我有一些被Findbugs報告爲具有NP_GUARANTEED_DEREF問題的代碼。 現在看我的代碼,我不太明白它有什麼問題,任何人都可以提出什麼問題。如何解決FindBugs問題「空值保證被取消引用」NP_GUARANTEED_DEREF

public void test() { 
    String var = ""; 
    int index = 2; 
    if (index == -1) { 
    var = String.class.getName(); 
    if (var.length() == 0) { 
     var = null; 
    } 
    } else { 
    var = Integer.class.getName(); 
    if (var.length() == 0) { 
     var = null; 
    } 
    } 
    if (var == null) {// FINBUGS reports on this line NP_GUARANTEED_DEREF 
    /* 
    * There is a statement or branch that if executed guarantees that a value 
    * is null at this point, and that value that is guaranteed to be 
    * dereferenced (except on forward paths involving runtime exceptions). 
    */ 
    throw new NullPointerException("NULL"); 
    } 
} 

現在鑽進在FindBugs的它突出兩個分配給var = null;爲事業,爲錯誤的錯誤,但我不明白爲什麼。這不是我實際上正在做任何與var對象有關的事情,我只是在做一個空檢查。這個例子是從真實的生產代碼中提取的,但是沒有任何不需要的來重現錯誤。我想知道這是否是誤報。如果不是什麼將是一個適當的修復。

這裏是鏈接到FindBugs的錯誤詳細信息:http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF

[更新]關於這個問題我現在已經在FindBugs的錯誤追蹤Sourceforge上的鏈接登錄這是一個假陽性recieving一些反饋後爲https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693

關於這個問題的討論將會繼續。

+0

你有沒有'var.equals(null)'之前?你確定你已經在該文件上重新運行Findbugs(我通常做的是我稱之爲「乾淨的bug標記」)。 – 2011-03-16 21:43:51

+0

是的,我相信我已經重新運行Findbugs,並且如果它很容易被理解,它從來就不是'var.equals(null)'。由於jzd說這看起來不錯。如果我得到更多的確認,這看起來不錯,我可能會發佈一個錯誤(錯誤肯定)Findbugs – AGrunewald 2011-03-16 21:49:01

+0

我看到。我可以在我的電腦上確認相同的FB行爲。看起來確實很奇怪。有趣的是,如果你用'throw new RuntimeException'替換拋出新的NullPointerException,錯誤標記就會消失。 – 2011-03-16 22:32:53

回答

5

我明白了。我可以在我的電腦上確認相同的FB行爲。看起來確實很奇怪。有趣的是,如果您用throw new RuntimeException代替throw new NullPointerException,錯誤標記將會消失。

現在我想我明白他們的意思了。信息的措辭並不準確,但他們警告你對NPE。我想他們認爲明確地拋出NPE是一種不好的做法。

0

更仔細地觀察到錯誤消息here的定義,它說:

有一個語句或分支,如果 執行的保證值是在這一點上 空,該值 那可以保證被解除引用 (除涉及 運行時異常前進路徑)

這讓我覺得這是要麼只是讓你千牛ow var將變爲null或者實際上讓findbugs認爲var在if語句中被引用。

您發佈的代碼看起來不錯,我會仔細檢查var是否在真正的代碼中沒有被訪問。

我可能會改變的唯一一件事就是倒着寫的比較像這樣:

if (null == var) 

這樣,如果你離開了=的一個很明顯/

+0

感謝您的答案jzd,雖然我同意您的比較交換,但不幸的是,這並不會改變Findbugs報告的內容。 – AGrunewald 2011-03-16 17:27:29

+0

@Agrune,我查了一下定義,現在我對自己的答案感覺更好。我已更新它以包含定義。 – jzd 2011-03-16 17:37:37

3

這是FindBugs中的一個bug,在他們的問題跟蹤器頁面上發佈這個問題。 findbugs.sf.net

+0

謝謝是的,確實這是一個錯誤,郵件列表給了同樣的答覆。我將它作爲一個錯誤提交併相應地更新我的問題。 – AGrunewald 2011-03-22 04:51:05

2

好的,FindBugs正在尋找的是一個語句或分支,它保證會導致空指針異常。最初,我們只查找空值的解除引用。後來我們增加了分析處理

if (x == null) throw new NullPointerException()

一樣x的明確的解引用。這主要是爲了幫助進行過程間分析,因此對其參數進行顯式空檢查的方法將被視爲取消引用其參數而不進行顯式空檢查的方法,並在爲這些參數傳遞空值時報告錯誤。

因此,我們錯誤信息中的一些文字可能需要更新,但是我們確實沒有發現許多引起混淆的現實情況。

我不太清楚上面代碼的目的是什麼。在你將var分配給var的地方,你正在創建一個情況,這將導致進一步顯式拋出一個空指針異常。這真的是你想要的行爲嗎?

+0

對話繼續在SourceForge bugtracker中查看https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693 – AGrunewald 2011-04-13 23:21:31