天天看點

findbug筆記

标簽: findbug (1)

findbugs是一個開源的eclipse 代碼檢查工具;它可以簡單高效全面地幫助我們發現程式代碼中存在的bug,bad smell,以及潛在隐患。針對各種問題,它并且提供了簡單的修改意見供我們重構時進行參考; 通過使用它,可以一定程度上降低我們code review的工作量,并且會提高review效率。 通過findbugs找到bug,再由我們自己重構代碼,可以培養我們的編碼意識及水準,形成好的習慣提高開發編碼能力。   Findbugs與PMD,checkStyle的差別: Findbugs主要着眼于尋找代碼中的缺陷,這就與其他類似工具有些差別了,比如說 Checkstyle和PMD就是根據樣式(style)來改進代碼品質的。FindBugs分析引擎與Checkstyle和PMD也有所不同,因為它 直接操作類檔案(class檔案)而不是源代碼。   (2)

在eclipse中安裝findbug插件: 下載下傳位址:

http://downloads.sourceforge.net/project/findbugs/findbugs%20eclipse%20plugin/1.3.9/edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.zip?use_mirror=ncu

1,把下載下傳的壓縮包解壓後,把plugin包copy到eclipse的plugin目錄中去;

2,重新啟動eclipse

3,打開eclipse->window->Preferences,搜尋關鍵字findbugs,如果能找到配置項,那麼表示安裝成功,如下圖.

(3)

findbugs 簡單易用,按照下圖操作即可: 選擇指定的包或者類進行findbug.

此時findbugs會周遊指定的包或者類,進行分析,找出代碼bug,然後集中顯示在 find bugs 的bugs explorer 中,下面我們添加bugs explorer。

bugs explorer 添加完畢後,我們就可以檢視剛剛找到的bugs了,如下圖.

findbug筆記

找出的bug有3中顔色, 黑色的臭蟲标志是分類, 紅色的臭蟲表示嚴重bug發現後必須修改代碼,橘黃色的臭蟲表示潛在警告性bug 盡量修改。(附錄是各種bug的解釋及修改方案,請大家按附表參考修改)

輕按兩下bug項目就可以在右邊編輯視窗自動打開相關代碼檔案并連接配接到代碼片段。 點選行号旁邊的小臭蟲圖示後再eclipse下方輸出區将提供詳細的bug描述,以及修改建議等資訊。我們可以根據此資訊進行修改。 (4) ant中使用findBugs:

從 http://findbugs.sourceforge.net/downloads.html 下載下傳最新版本的Findbugs,目前的版本是1.3.0, 于2007年11 月8日釋出。把解壓後目錄複制到項目的lib目錄下,然後就可以和Ant配合使用了。FindBugs工作在j2se1.4.0或以 後的版本中,需要至少256MB記憶體。

8.1

在Ant腳本中,首先定義Findbugs的解壓目錄位置:

<path id="findbugs.path" >

     <fileset  dir ="${lib.home}/findbugs-1.3.0">

        <include  name ="**/*.jar"/>

     </fileset>

</path>

8.2

接着聲明Findbugs任務:

<taskdef name="findbugs" classpathref="findbug.path" target="_blank" rel="external nofollow" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />

8.3

建立任務:

 <target name="findbug" depends="zip"> 

  <delete dir="${findbugs.result}" />

  <mkdir dir="${findbugs.result}" />

  <findbugs home="${findbugs.path}" output="xml:withMessages" outputFile="${findbugs.result}/bug.xml" jvmargs="-Xmx1000m" timeout="6000000"> 

<!--  以下定義findbugs查找的類路徑  -->

<class location="F:/CruiseControl/projects/DM_Management_Console/assemble/dm.war.zip"></class>

<!--  以下定義源代碼的路徑  -->

<sourcePath path="F:/CruiseControl/projects/DM_Management_Console"></sourcePath>

<!--  以下定義上述類所依賴的類路徑  -->

   <auxClasspath> 

    <fileset dir="${webapp}/lib"> 

     <include name="*.jar" /> 

    </fileset>

   </auxClasspath>

  </findbugs> 

 </target> 自己做的執行個體分析:                  < property name ="findbugs.path" value ="${webapp.test.libpath}/findbugs-1.3.9" />         

                 < property name ="findbugs.result" value ="${webapp.checkCodesResult}/findbugs" />         

                 < path id ="findbug.path" >                 

                                 < fileset dir ="${findbugs.path}" >          

                                      < include name ="*.jar" / >                 

                                 </ fileset >                 

                 </ path >         

                <!-- 定義findBugs任務 -->        

                 < taskdef name ="findbugs" classpathref ="findbug.path"         

classname ="edu.umd.cs.findbugs.anttask.FindBugsTask" />         

                <!-- 定義将xml檔案轉換為html任務 -->        

                 < taskdef name ="convertXmlToText"         

classname ="edu.umd.cs.findbugs.anttask.ConvertXmlToTextTask" >         

                                 < classpath refid ="findbug.path" />         

                 </ taskdef >         

                 < target name ="findbug" >                 

                                 < delete dir ="${findbugs.result}" />         

                                 < mkdir dir ="${findbugs.result}" />         

                                 < findbugs home ="${findbugs.path}" output ="xml:withMessages"         

outputFile ="${findbugs.result}/bug.xml" jvmargs ="-Xmx1000m" timeout ="6000000" >                  

                                      < class location ="${webapp.assemble}/dm.war/WEB-INF/classes" > </ class >                  

                                      < sourcePath path ="${webapp.java}" > </ sourcePath >         

                                                 < auxClasspath >                  

                                                             < fileset dir ="${webapp.lib}" >          

                                                                   < include name ="*.jar" />                  

                                                              </ fileset >          

                                                              < fileset dir ="${servlet.lib}" >          

                                                                    < include name ="*.jar" />                  

                                                               </ fileset >         

                                                 </ auxClasspath >         

                                 </ findbugs >                 

                                <!-- 将xml轉換為html -->         

                     < convertXmlToText home ="${findbugs.path}" input ="${findbugs.result}/bug.xml"     output ="${findbugs.result}/findbugs.html" format ="html:default.xsl" />         

                 </ target >         

分析:        

home:定義了findbug所有的lib包位置;        

output:定義了findbug的輸出檔案類型;        

outputFile:輸出檔案的位置名稱;        

jvmargs:設定findbugs運作參數;        

class: -->important        

設定findbug要檢測的代碼的class檔案位置.FindBugs分析引擎與Checkstyle和PMD也有所不同,因為它直接操作類

檔案(class檔案)而不是源代碼。此屬性一定要寫!!!        

注意:        

設定此路徑是,對項目中非檢測class的檔案(如:系統依賴的jar包),不要包括在此class路徑中.否則,findbug也會對jar中的内容進行檢測,便檢測時間變長很多;導易導緻out of menery.          

如:        

若 < class location ="${webapp.assemble}/dm.war.zip" > </ class > ,class會指向目前項目的所有檔案.則目前項目依賴的jar包,如struts2-core.jar都會被findbug. 檢測完目前項目須7 min 34 sec        

若正确設定 < class location ="${webapp.assemble}/dm.war/WEB-INF/classes" /> ,則隻須10 sec即可.        

sourcePath: -->important        

定義檢測class檔案的源碼.為可選項.不寫也不會影響findbug結果.若指定目錄,使 FindBugs 可以在 GUI 中檢視    

XML 結果時突出顯示出錯的源代碼。        

auxClasspath: -->important        

設定目前項目所需的依賴包,否則會出現missing class.         (5) 在生成的html report中,點選每一條bug,可下拉檢視目前bug的詳細資訊.

findbug筆記

(6) 使用過濾器

使用過濾器我們就可以定義使用哪些bug檢測器和針對哪些類進行檢查,因為一旦項目比較龐大,那檢視冗長的bug 報告也是十分痛苦的事情。使用過濾器,過濾器用來包含或排除特殊的bug報告。這樣做有助于在特定的時間段内, 聚焦我們的關注點。過濾器實際是在一個xml檔案定義的,xml配置檔案的内容如下:

<FindBugsFilter>

     <!--  該類使用所有的bug檢測器  -->

     <Match>

       <Class name="com.foobar.MyClass" />

     </Match>  

     <!--  該類使用bugcode為HE的檢測器  -->

     <Match class ="com.foobar.BClass">

         <BugCode  name ="HE"/>

     </Match>

     <!--  該類通過指定縮寫名使用一些bug檢測器  -->

     <Match>

       <Class name="com.foobar.MyClass"/ >

       <Bug code="DE,UrF,SIC" />

     </Match>

</FindBugsFilter>

在findBugs定義屬性時,加上相應的過濾器,如下:

<findbugs home ="${findbugs.home}" includeFilter="${findbugs_include_filter}"

excludeFilter="${findbugs_exclude_filter}" ...>

具體可參考:

http://hulongzhou.blog.hexun.com/33024717_d.html (7) findBugs出現過的問題:

java.lang.OutOfMemoryError: requested 40960 bytes for GrET in C:/BUILD_AREA/jdk6_10/hotspot/src/share/vm/utilities/growableArray.cpp. Out of swap space?

解決方法:

swap space問題.--虛拟記憶體設定不足或沒設定的問題.

我的電腦-->屬性-->進階-->性能-->設定-->進階-->虛拟記憶體設定.

當運作ant findbug時,可以輕按兩下找開:

C:/Program Files/Java/jdk1.6.0_10/bin/jconsole.jar.

可以點選裡面檢測到的"ant","findbug"線程,檢視各自占用的資源.

說明:

findbug是比較會占用資源的.

調高可用資源大小,有三方面:

第一,調高findbug參數:在build.xml中有:

<findbugs home="${findbugs.path}" output="xml:withMessages" outputFile="${findbugs.result}/bug.xml" jvmargs="-Xmx1000m" timeout="6000000">

第二,調高ant的大小:

在"環境變量"中,添加:ANT_OPTS=-Xms256m -Xmx1024m

第三,調高CC的大小:

在cruiseControl.bat中調高配置,如: set CC_OPTS=-Xms256m -Xmx1024m

繼續閱讀