詳解eclipse插件findbugs新規則的開發過程

大家都知道java開發的應用,代碼量都是很龐大的,並且所有的代碼不可能是一個人完成的,如何保證我們代碼的高質量呢?靜態掃描工具findbugs是不錯的選擇

 

java應用最常見的也就是NullPointException問題了。平時我們做小的項目出幾個NPE沒什麼太大的影響,打幾個錯誤日誌,下次修復掉就行了。但是如果是淘寶、支付寶這樣的大型系統,每天用戶量很大,可能一個NPE就會影響到很多用戶的系統使用。findbugs會容易的找出這些問題。

 

有的時候findbugs不能滿足我們的需求,我們需要在代碼掃描階段就發現更多的問題,那麼就需要開發針對自己需求的findbugs規則。比如:生產環境的代碼中是不允許有System.out.prinln("xxxxx");這樣的信息出現的,必須使用log來記錄日誌,所以我們就可以專門寫一條規則來檢測代碼裏面是否存在System.out,如果存在就給出提示。

同樣的,在使用log日誌的時候,必須要先判斷日誌的級別然後再使用log.debug(""),所以我們可以定義一條日誌來檢測代碼中是否存在沒有使用if條件判斷就直接log.debug(),有的話給出提示。

 

進入正題,通過找代碼中是否存在System.out來講解findbugs規則的開發過程

效果:

 

 

準備工作:

1 findbugs源碼的下載下載路徑:

http://code.google.com/p/findbugs/source/checkout 通過svn下載,svn命令: Svn checkout http://findbugs.googlecode.com/svn/trunk/ findbugs-read-only
2 將源碼導入eclipse

在eclipse中選擇import --- plug-ins and fragments,選擇下載的findbugs源碼的路徑import as選項卡中選擇 projects with source folders

添加plug-ins的時候記得不要選擇中間的那個,中間的是test,也可以選擇全導入
3 項目環境設置
在edu.umd.cs.findbugs.plugin.eclipse項目中找到plugin.xm用manifest editor打開,在build選項卡中add Library:findbugs-plugin.jar,選中findbugs-plugin.jar,add folder:src

在findbugs項目中找到MANIFEST.MF,在build中add Library:findbugs.jar,選中findbugs-plugin.jar,add folder:src/java,src/java5,src/tools,src/antTask

開發新規則:
1.首先認識幾個文件
Findbugs.xml
對於每一個新的檢測器,在 FindBugs.xml 文件中增加一個 Detector 元素和一個 BugPattern 元素。 Detector 元素指定用於實現檢測器的類以及它是快速還是慢速檢測器。其中reports屬性是和edu.umd.cs.findbugs.detect中類report的錯誤相對應的和Bugpattern中的type一致且唯一。

category 屬性是枚舉類型。
它是以下類型中的一種:
CORRECTNESS :一般正確性問題
MT_CORRECTNESS :多線程正確性問題
MALICIOUS_CODE :如果公開給惡意代碼,有可能成爲攻擊點
PERFORMANCE :性能問題 

Message.xml
messages.xml 文件由三個元素組成: Detector 、 BugPattern 和 BugCode 。檢測器的 class 屬性應當指定檢測器的類名。 Details 元素包含檢測器的簡單 HTML 描述,這裏面主要寫錯誤的提示信息。

FindBugs 利用了 Byte Code Engineering Library,稱爲 BCEL,以實現其檢測器。所有字節碼掃描檢測器都基於 visitor 模式。側重於兩個方法------ visit(Code) 和 sawOpcode(int) 。在 FindBugs 分析類時,它會在分析方法內容時調用 visit(Code) 方法。與此類似,FindBugs 在分析方法正文中的每一個操作碼時調用 sawOpcode(int) 方法。


下面我們看一個列子:在企業級開發中,是不允許用System.out來輸出信息的,必須要用log日誌來打印出信息,所以我們就增加一個findbugs的新規則發現代碼中有system.out的時候就給用戶提示,一下是開發步驟

先看一段通過javap反編的java代碼對比
源碼:

Java代碼 
 
 


反編:

Java代碼 
  
通過反編的代碼我們可以看到調用system.out.println的時候是通過


12: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
這句來執行的,所以我們只要找到getstatic指令,並判斷方法調用是System.out就可以知道是用了System.out,就可以聲明bug並且報告bug

findbugs代碼

Java代碼 
  

new BugInstance(this, "ALP_SYSTEMCLASS", NORMAL_PRIORITY)
ALP_SYSTEMCLASS這個和findbugs.xml、message.xml中相對應
findbugs的新規則開發使用了visit模式,我們只需要實現visit方法sawOpcode方法即可,當然實現複雜功能,有不同的父類

在findbugs.xml中把自己的Detector 聲明出來

Xml代碼 
  

message.xml
 

這裏配置錯誤的顯示信息

最終把
java類、xml按照下面這個ant腳本的描述進行打包
  
命令行ant就打包了,把打好的jar包放到findbugs插件的plugin目錄下,重啓eclipse就可以使用新的規則了
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章