隨筆 - 34, 文章 - 1, 評論 - 2, 引用 - 0
          數(shù)據(jù)加載中……

          Java靜態(tài)檢測工具的簡單介紹


          轉自
          http://qa.taobao.com/?p=9015

          靜態(tài)檢查:靜態(tài)測試包括代碼檢查、靜態(tài)結構分析、代碼質(zhì)量度量等。它可以由人
                  工進行,充分發(fā)揮人的邏輯思維優(yōu)勢,也可以借助軟件工具自動進行。
                  代碼檢查代碼檢查包括代碼走查、桌面檢查、代碼審查等,主要檢查代碼和
                  設計的一致性, 代碼對標準的遵循、可讀性,代碼的邏輯表達的正確性,代
                  碼結構的合理性等方面;可以發(fā)現(xiàn)違背程序編寫標準的問題,程序中不安全、
                  不明確和模糊的部分,找出程序中不可移植部分、違背程序編程風格的問題,
                  包括變量檢查、命名和類型審查、程序邏輯審查、程序語法檢查和程序結構
                  檢查等內(nèi)容。”。看了一系列的靜態(tài)代碼掃描或者叫靜態(tài)代碼分析工具后,
                  總結對工具的看法:靜態(tài)代碼掃描工具,和編譯器的某些功能其實是很相似的,
                  他們也需要詞法分析,語法分析,語意分析...但和編譯器不一樣的是他們可
                  以自定義各種各樣的復雜的規(guī)則去對代碼進行分析。

          靜態(tài)檢測工具:
          1. PMD
               1)PMD是一個代碼檢查工具,它用于分析 Java 源代碼,找出潛在的 問題:
          1)潛在的bug:空的try/catch/finally/switch語句
          2)未使用的代碼:未使用的局部變量、參數(shù)、私有方法等
          3)可選的代碼:String/StringBuffer的濫用
          4)復雜的表達式:不必須的if語句、可以使用while循環(huán)完成的for循環(huán)
          5)重復的代碼:拷貝/粘貼代碼意味著拷貝/粘貼bugs
          2)PMD特點:
          1)與其他分析工具不同的是,PMD通過靜態(tài)分析獲知代碼錯誤。也就是說,在
          不運行Java程序的情況下報告錯誤。
          2)PMD附帶了許多可以直接使用的規(guī)則,利用這些規(guī)則可以找出Java源程序的許
          多問題
          3)用戶還可以自己定義規(guī)則,檢查Java代碼是否符合某些特定的編碼規(guī)范。
          3)同時,PMD已經(jīng)與JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、
          CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、
          IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs
          集成在一起。
          4)PMD規(guī)則是可以定制的: 可用的規(guī)則并不僅限于內(nèi)置規(guī)則。您可以添加新規(guī)則:
          可以通過編寫 Java 代碼并重新編譯 PDM,或者更簡單些,編寫 XPath 表
          達式,它會針對每個 Java 類的抽象語法樹進行處理。
          5)只使用PDM內(nèi)置規(guī)則,PMD 也可以找到你代碼中的一些真正問題。某些問題可能
          很小,但有些問題則可能很大。PMD 不可能找到每個 bug,你仍然需要做單元測
          試和接受測試,在查找已知 bug 時,即使是 PMD 也無法替代一個好的調(diào)試器。
          但是,PMD 確實可以幫助你發(fā)現(xiàn)未知的問題。
          
          1. FindBugs
               1)FindBugs是一個開源的靜態(tài)代碼分析工具,基于LGPL開源協(xié)議,無需
          運行就能對代碼進行分析的工具。不注重style及format,注重檢測真正
          的bug及潛在的性能問題 ,尤其注意了盡可能抑制誤檢測(false positives)
          的發(fā)生。以bytecode(*.class、*.jar)為對象進行檢查。除了單獨動作,還可
          以用作Eclipse 的plug-in,以及嵌入Ant作為task之一 進行利用。
          2)findbugs自帶檢測器的介紹:  findbugs自帶60余種Bad practice,80余種
          Correntness,1種Internationalization,12種Malicious code
          vulnerability,27種Multithreaded correntness,23種Performance,
          43種Dodgy。
          3)Findbugs的一些特點:
          1)FindBugs主要著眼于尋找代碼中的缺陷,這就與其他類似工具有些區(qū)別了,
          直接操作類文件(class文件)而不是源代碼。
          2)FindBugs可以通過命令行、各種構建工具(如Ant、Maven等)、獨立的
          Swing GUI或是以Eclipse和NetBeans IDE插件的方式來運行。                
          3)FindBugs輸出結果既可以是XML的,也可以是文本形式的。
          4)開發(fā)者可以通過多種方式來使用FindBugs,最常見的是在新編寫模塊的代碼
          分析以及對現(xiàn)有代碼進行更大范圍的分析。   
          5)不注重style及format,注重檢測真正的bug及潛在的性能問題,
          尤其注意了盡可能抑制誤檢測(false positives)的發(fā)生。    
          4)FindBugs可檢測的bug pattern舉例:
          檢測java programing中容易陷入的bug pattern,equals() 實現(xiàn)時的一般規(guī)約違反
          Null pointer的參照 ,Method的返回值的check遺漏 ,初始化前field的訪問,
          Multi-thread的正確性, 同期化處理的矛盾, 無條件的wait(),  Code的脆弱性 ,
          可以變更的靜態(tài)object ,內(nèi)部數(shù)列參照的return等
          
          1. Checkstyle
               1)定義: Checkstyle是一款檢查Java程序源代碼樣式的工具。
          2)特點:
          1)它可以有效的幫助我們檢視代碼以便更好的遵循代碼編寫標準,特
          別適用于小組開發(fā)時彼此間的樣式規(guī)范和統(tǒng)一。
          2)Checkstyle提供了高可配置性,以便適用于各種代碼規(guī)范,所以
          除了使用它提供的幾種常見標準之外,你也可以定制自己的標準。
          3)Checkstyle提供了支持大多數(shù)常見IDE的插件,大部分插件中就含有
          最新的Checkstyle,就不用費心再部署一份了。
          4)Checkstyle可以檢查代碼的很多方面,從傳統(tǒng)觀點看,它主要是用來
          檢查代碼層面的,自從第三版以后,它的內(nèi)部架構作了重大改變,很多
          其它意圖的檢測加了進來,現(xiàn)在Checkstyle可以檢查像類設計的問題,
          重復代碼,如鎖的雙重檢查的bug模式。
          3)CheckStyle的主要流程是:
          1)對Java文件進行詞法語法分析,生成語法樹。
          2)載入配置文件(checkstyle-metadata.xml以及自定義的配置文件)
          register check事件。
          3)按照深度優(yōu)先遍歷對語法樹進行解析,按照注冊的事件,在到達某些節(jié)點
          ( AST ) 時進行style檢查(AST,A child-Sibling Tree,是語法
          樹中的某個節(jié)點,其類型在TokenTypes類中定義。)
          4)我們所說的自定義Style的檢查,就是在第二步設定的。
          這里牽涉到一個叫com.puppycrawl.tools.checkstyle.api.Check 的類,
          我們通常需要重載其中的兩個函數(shù): public int[] getDefaultTokens()
                  public void visitToken(DetailAST ast). 這兩個函數(shù)的含義為,
          在遍歷語法樹的過程中,每當?shù)竭_getDefaultTokens函數(shù)所返回的AST類型,
          程序就進入visitToken進行具體的檢查和分析,即,真正的分析檢查過程是在
          visitToken中實現(xiàn)的。
          
          1. Hammurapi
               1)定義: Hammurapi它是一個開源的代碼審查/評審(review)工具。它可以幫助改進
          Java代碼的質(zhì)量。它可以基于一套設計規(guī)范來分析代碼庫。當它碰到違反規(guī)
          范的地方,會在報告中標識。就像Checkstyle一樣,它與Ant無縫集成并且
          由基于XML配置文件來驅動。
          2)特點:
          1)Hammurapi是用來強制代碼設計規(guī)范的。
          2)Hammurapi是一個遵循設計的工具,提供了自動而且一致的方式來實現(xiàn)設計規(guī)范,
          因此使代碼評審更加有效而輕松。
          3)Hammurapi如何工作:
                   Hammurapi這樣的代碼分析工具都帶有語言分析器。語言分析器是一種輸入
          語言代碼并輸出抽象語法樹的工具。這個樹上的節(jié)點代表語言標識。例如,考
          慮一下簡單的算術表達式:3+4. 語言分析器會解析他成為一個如圖5所示的語
          法樹。在這個樹中,節(jié)點+代表操作符標識。節(jié)點3和4是操作數(shù)標識Hammurapi
          使用ANTLR(另一個語言識別工具)作為語言分析器。然而ANTLR API是相當?shù)讓拥摹?
          為改善可用性,Hammurapi使用另一個API,基于ANTLR 的JSEL(Java源程序
          工程類庫),來訪問抽象語法樹。 一旦樹構建完成,一種樹遍歷算法就被用來訪
          問樹中每一個節(jié)點。每次訪問到一個節(jié)點,一種回調(diào)機制(Visitor模式)被用來
          提示相應的檢查器。在這些回調(diào)方法中,檢查器收集相關的信息來確定是否有違反
          規(guī)范的地方存在。  
          
          1. Lint4j
               1)定義:Lint4J是一個針對Java的源代碼分析工具,它可以對Java源碼和字節(jié)
          碼進行靜態(tài)分析,判斷其中是否存在死鎖、性能問題或者伸縮性問題。
          它可以集成到任何IDE種或構建系統(tǒng)
          2)特點:
          1)檢測代碼語法規(guī)則
          2)潛在的bug
          3)檢測編碼模式對代碼可讀性及大小的影響
          4)檢測是否違反EJB規(guī)范
          
          1. Sonar
               1)定義:代碼質(zhì)量管理工具Sonar提供了設計與架構度量。Sonar 2.0引入了
          針對Java應用的設計分析、架構與面向對象的度量,Sonar 2.1可以
          檢測到未使用的方法以及對不建議使用方法的調(diào)用。是一個集成了
          CheckStyle,PMD,Findbugs的代碼校驗規(guī)則 ,重復代碼發(fā)現(xiàn),
          代碼測試覆蓋率, 代碼注釋率,及所有的檢測率變化追蹤的完美
          代碼質(zhì)量檢查工具。它包含了代碼質(zhì)量檢測的七個方面,如下圖
          2)特點:
                  1)代碼覆蓋:通過單元測試,將會顯示哪行代碼被選中。
          2)改善編碼規(guī)則。
          3)搜尋編碼規(guī)則:按照名字,插件,激活級別和類別進行查詢。
          4)項目搜尋:按照項目的名字進行查詢。
          5)對比數(shù)據(jù):比較同一張表中的任何測量的趨勢。
          6)單元測試
          3)Sonar2.1:
          Sonar還基于Squid引入了一個全新的規(guī)則引擎、Sonar解析器既可以處
          理源代碼,也可以處理字節(jié)碼,解析器帶有內(nèi)建的規(guī)則,可以檢測未使用
          的私有與保護方法以及客戶端對不建議使用的方法的調(diào)用。
          Squid通過分析應用源代碼、Java API和外部程序庫
          的字節(jié)碼來決定哪些方法、類和屬性是不建議使用的。
          Sonar 2.1的新特性:
          1)一個全新的“Libraries”頁面,顯示了項目中所有的程序庫和依賴,該特性要求使用
          Maven來構建項目。
          一旦在Sonar站點的主頁上選擇了一個項目,該服務就會以
          可視化的樹形結構展示出項目依賴。此外,還有一個可選的
          動態(tài)過濾器,可以根據(jù)名稱過濾程序庫以便在應用的依賴間導航。
          2)用于搜索程序庫使用情況的“Dependencies”頁面。比如說,可以
          搜索到使用了第三方框架如Commons Logging 1.1的所有項目。
          3)可以使用各種插件擴展Sonar的功能。現(xiàn)在有一個全新的
          “System Info”頁面顯示了系統(tǒng)屬性、已裝插件和Java虛擬機內(nèi)存
          統(tǒng)計信息。該頁面還給出了關于Sonar配置和數(shù)據(jù)庫統(tǒng)計的詳細信息。
          4)一個用于管理已裝插件和系統(tǒng)信息的管理控制臺。
          最新版的Sonar為這些插件引入了一個測試框架和一個客戶化的Maven
          生命周期管理工具。它還帶有一個用于集成項目事件的
          Web Service并在項目的size widget中增加了一個新的度量模塊。
          
          1. JDepend
               1)JDepend一個開放源代碼的可以用來評價Java程序質(zhì)量的優(yōu)秀工具,
          它遍歷Java class的文件目錄,以Java包(package)為
          單位,為每一個包/類自動生成 包的依賴程度,穩(wěn)定性,可靠度等
          的評價報告,根據(jù)這些報告,我們可以得到包或類之間的依賴關
          系,并分析出包的穩(wěn)定程度,抽象程度,是否存在循環(huán)依耐關系等 。
          可以根據(jù)JDepend給出的報告數(shù)據(jù),分析出我們的包是否是
          可靠的,穩(wěn)定的,健壯的包,是否符合面向對象的設計原則。
          2)特點:
          1)評價設計質(zhì)量
          2)翻轉依賴性
          3)支持并行開發(fā)和極限編程
          4)獨立的發(fā)布模塊
          5)識別package的循環(huán)依賴
          3)Depend生成的Java包的質(zhì)量評價報告主要包括:    
          1)Number of Classes and Interfaces:實現(xiàn)類與抽象接口的數(shù)目
          2)Abstractness (A):包的抽象度。指一個包內(nèi)包含的抽象類或接口
          占整個包中的類的比重。
          3)Afferent Couplings (Ca):向心耦合。依賴該包(包含的類)的外
          部包(類)的數(shù)目(i.e. incoming dependencies),該數(shù)值越大,
          說明該包的擔當?shù)穆氊熢酱螅簿驮椒€(wěn)定。
          4)Efferent Couplings (Ce):離心耦合。被該包依賴的外部包的數(shù)目
          (i.e. outgoing dependencies),該數(shù)值越大, 說明該包越不獨
          立(因為依賴了別的包),也越不穩(wěn)定。
          5)Instability (I):衡量一個包的不穩(wěn)定程度。I=Ce/(Ce+Ca)。它的值處于
          [0,1]之間。I=0時說明包是最穩(wěn)定的,反之I=1則說明包極不穩(wěn)定。
          6)Distance from the Main Sequence (D): 該指標主要用來評價包的抽象
          程度與穩(wěn)定程度的平衡關系,它可以用二維直線圖 A + I = 1 來表示。
          7)Package Dependency Cycles:包的循環(huán)依賴度。
          8.  IBM Checking Tool for Bugs Errors and Mistakes(簡稱BEAM)
          1) 定義:是 IBM 開發(fā)的一個靜態(tài)分析工具,可以用于分析并查找出 C, C++ 和 Java
          代碼中的一些不容易發(fā)現(xiàn)的潛在錯誤,從而達到提高代碼質(zhì)量的目的。同動態(tài)
          分析工具和其它靜態(tài)分析工具相比,它擁有一些可貴的特性。
          2)特點:
          1)對代碼進行語法掃描,通過算法對代碼進行檢查分析
          2)和一些 bug 模式進行比較,最終標明問題區(qū)域,輸出分析結果
          3)使用了額外的定理證明(theorem proving)技術來判斷一個潛在的錯誤是否
          是真正的錯誤,從而減輕了程序員判斷錯誤真?zhèn)嗡璧墓ぷ髁?
           9. LDRA Testbed  
          1)定義:LDRA Testbed為應用軟件的確認和驗證提供強大的源代碼測試和分析功能,
          是獨特的質(zhì)量控制工具。 它有助于提高計算機軟件必需的可靠性,健壯性和盡
          可能的零缺陷,它的使用帶來時間、成本和效率上真實的節(jié)省,這些都是無法衡
          量其價值的。它是強大和完整的集成工具包,使先進的軟件分析技術應用在開發(fā)生
          命周期的關鍵階段。
          2)LDRA Testbed提供強大的分析功能,用于兩個主要的測試領域,靜態(tài)分析和動態(tài)分析。
          1)靜態(tài)分析: 分析代碼,并且提供對代碼結構的理解。
          2)動態(tài)分析: 利用源代碼的插裝版本,使用測試數(shù)據(jù)執(zhí)行,在運行時發(fā)現(xiàn)軟件
          缺陷
          3) 使用LDRA testbed 的好處
          軟件開發(fā)和測試過程的成本效率分析工具
          單元、集成和系統(tǒng)測試的理想工具 
          貫穿于軟件開發(fā)的整個生命周期
          LDRA Testbed應用于許多不同的領域 
          過程改進
          軟件測試
          軟件維護
          LDRA Testbed的優(yōu)點:
          改進軟件質(zhì)量
          定位軟件缺陷
          強制執(zhí)行工業(yè)標準
          減少維護費用40%以上
          減少開發(fā)和測試成本75%以上
          通過自動化過程提高員工動力
          10.   Yasca 
          1) 定義:yasca是一個開源靜態(tài)代碼分析工具插件框架, 集成流行的多語言靜態(tài)分析工
          具如findbugs/pmd/jlint/rats/cppcheck,由于插件本身多樣故可支持java
          c++等語言靜態(tài)分析.Yasca是一個用來尋找安全漏洞,在程序的源代碼中檢測代
          碼質(zhì)量、性能以及一致性的軟件。它集成了其他開源項目,其中包括FindBugs
          PMD ,JLint , Cppcheck ,并掃描某些文件類型,以及自定義掃描書面的
          Yasca 這是一個命令行工具,與報告中生成的HTML , CSV格式, XML的,的
          SQLite ,和其他格式。
          

          posted on 2011-03-01 17:12 河馬虎 閱讀(2122) 評論(1)  編輯  收藏 所屬分類: java

          評論

          # re: Java靜態(tài)檢測工具的簡單介紹[未登錄]  回復  更多評論   

          Jtest軟件也可以做java代碼靜態(tài)分析.

          Jtest的靜態(tài)代碼分析能自動檢測代碼是否符合超過800條的程序編碼規(guī)范和任意數(shù)量的用戶定制的編碼規(guī)則,幫助開發(fā)者避免出現(xiàn)這些隱蔽且難以修復的編碼錯誤。靜態(tài)代碼分析還能幫助用戶預防一些特殊用法的錯誤,提高安全性,增加代碼的可讀性和可維護性,并且將適合重構的代碼定位。靜態(tài)代碼分析能夠自動解決大多數(shù)編碼問題,從而迅速地進行代碼優(yōu)化。

          程序開發(fā)者和QA通過Jtest不僅能夠建立應用于不同級代碼正確性和可靠性的測試套件(Test Suite),還能為用于回歸測試的基礎版本捕捉代碼行為。

          Jtest參考:http://www.innovatedigital.com/JavaTuning/Jtest.shtml
          2012-08-20 08:43 | 劉邦
          主站蜘蛛池模板: 武夷山市| 武安市| 霍州市| 新化县| 静安区| 鄂温| 东港市| 平江县| 余庆县| 分宜县| 大冶市| 思南县| 东乡族自治县| 启东市| 临安市| 隆尧县| 治多县| 思南县| 东平县| 云和县| 根河市| 安国市| 宁强县| 揭东县| 天镇县| 天全县| 桐庐县| 富民县| 黑山县| 兰州市| 西平县| 哈巴河县| 赣州市| 德庆县| 砚山县| 沙湾县| 容城县| 凤城市| 嫩江县| 临安市| 睢宁县|