2010-06-01 140 views
7

我最近開始在我正在做的java構建中使用findbugs靜態分析工具。第一份報告帶有高優先級警告。作爲迷戀型的人,我準備好全力以赴。但是,我必須錯過一些東西。比較事情時,我會得到大部分警告。如下面的代碼:Findbugs和比較

public void setSpacesPerLevel(int value) 
    { 
     if(value >= 0) 
     { 
     spacesPerLevel = value; 
     } 
     else 
     { 
     spacesPerLevel = 0; 
     } 
    } 

在讀取的if語句中產生高優先級警告。

文件:Indenter.java,行:60,類型: BIT_AND_ZZ,優先順序:高度,類別: 正確性檢查,看是否((...)& 0)== 0 樣本。 Indenter.setSpacesPerLevel(int)

我將int與int進行比較,看起來像是常見的事情。我通過類似的簡單比較得到了相當多的這種類型的錯誤。

我有很多似乎是簡單代碼塊的其他高優先級警告。我在這裏錯過了什麼嗎?我意識到靜態分析可能會產生誤報,但我所看到的錯誤似乎太小而無法成爲誤報。

這個也讓我撓撓腦袋。

for(int spaces = 0;spaces < spacesPerLevel;spaces++) 
    { 
     result = result.concat(" "); 
    } 

這樣做具有以下FindBugs的警告:

File: Indenter.java, Line: 160, Type: IL_INFINITE_LOOP, Priority: High, Category: CORRECTNESS 

There is an apparent infinite loop in sample.Indenter.indent() 

This loop doesn't seem to have a way to terminate (other than by perhaps throwing an exception). 

任何想法?

所以基本上我有一些文件和50-60高優先級的警告類似於上面的。我使用的FindBugs 1.3.9從FindBugs的調用螞蟻任務

UPDATE: 我有這個版本是由哈德森服務器執行,不得不由三葉草代碼覆蓋被儀表的代碼。當我將其關閉時,所有高優先級警告都消失了。這是有道理的。感謝您的反饋。

+0

如果您要更改循環內的spacesPerLevel,這可能是一個無限循環,例如。 spacesPerLevel = spaces + 2;或減少空間。 – Anton 2010-06-01 16:02:37

+0

剛剛更新了包含更多代碼片段的問題 – 2010-06-01 16:06:05

+0

您是否正在編譯調試信息? – Anton 2010-06-01 16:28:16

回答

7

更新:我有一個哈德森服務器執行此構建,並已由代碼覆蓋率由Clover檢測代碼。當我將其關閉時,所有高優先級警告都消失了。這是有道理的。感謝您的反饋。

1

你是否運行Findbugs通過Eclipse插件,螞蟻還是gui?有沒有可能你的代碼沒有重新編譯,因爲你運行它(在進行更改之前)?

如果setSpacesPerLevel不是太長,後期的

輸出javap的-v TheClassThatContainssetSpacerPerLevel

至於第二個錯誤,你必須顯示整個循環之前可以說,如果它是一個問題。

+0

我從螞蟻運行它。目標在進行任何構建或靜態分析之前進行清理。處理javap輸出... – 2010-06-01 16:07:07

3

一個側面說明:

for(int spaces = 0;spaces < spacesPerLevel;spaces++) 
{ 
    result = result.concat(" "); 
} 

如果resultjava.lang.String,這可能是低效的,因爲你做以下步驟爲每個空格字符:

  1. 創建一個新的char[]舉行級聯結果
  2. 創建一個包含字符數組的java.lang.String實例

如果您重複執行此操作,尤其是result已經很長時間,則需要很長時間。

如果性能(時間和內存)對於該方法很重要,則應考慮使用StringBuilder(非線程安全)或StringBuffer(線程安全)。

+0

謝謝!我從.NET移植了這段代碼(我在java部門有點生疏)。在我們使用的.net字符串類上有一個構造函數,它允許你重複一個字符X次。這是我的快速和骯髒的解決方案,但它從一開始就是錯誤的。謝謝! – 2010-06-01 18:14:11