Java靜態檢測工具/Java程式碼規範和質量檢查簡單介紹
阿新 • • 發佈:2019-06-26
靜態檢查:
靜態測試包括程式碼檢查、靜態結構分析、程式碼質量度量等。它可以由人工進行,充分發揮人的邏輯思維優勢,也可以藉助軟體工具自動進行。程式碼檢查程式碼檢查包括程式碼走查、桌面檢查、程式碼審查等,主要檢查程式碼和設計的一致性, 程式碼對標準的遵循、可讀性,程式碼的邏輯表達的正確性,程式碼結構的合理性等方面;可以發現違背程式編寫標準的問題,程式中不安全、不明確和模糊的部分,找出程式中不可移植部分、違背程式程式設計風格的問題,包括變數檢查、命名和型別審查、程式邏輯審查、程式語法檢查和程式結構檢查等內容。”。看了一系列的靜態程式碼掃描或者叫靜態程式碼分析工具後,總結對工具的看法:靜態程式碼掃描工具,和編譯器的某些功能其實是很相似的,他們也需要詞法分析,語法分析,語意分析...但和編譯器不一樣的是他們可以自定義各種各樣的複雜的規則去對程式碼進行分析。
靜態檢測工具:
PMD
- 1)PMD是一個程式碼檢查工具,它用於分析Java原始碼,找出潛在的問題:
- 1)潛在的bug:空的try/catch/finally/switch語句
- 2)未使用的程式碼:未使用的區域性變數、引數、私有方法等
- 3)可選的程式碼:String/StringBuffer的濫用
- 4)複雜的表示式:不必須的if語句、可以使用while迴圈完成的for迴圈
- 5)重複的程式碼:拷貝/貼上程式碼意味著拷貝/貼上bugs
- 2)PMD特點:
- 1)與其他分析工具不同的是,PMD通過靜態分析獲知程式碼錯誤。也就是說,在不執行Java程式的情況下報告錯誤。
- 2)PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程式的許多問題
- 3)使用者還可以自己定義規則,檢查Java程式碼是否符合某些特定的編碼規範。
- 3)同時,PMD已經與JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs整合在一起。
- 4)PMD規則是可以定製的: 可用的規則並不僅限於內建規則。您可以新增新規則:可以通過編寫Java程式碼並重新編譯PDM,或者更簡單些,編寫XPath表示式,它會針對每個Java類的抽象語法樹進行處理。
- 5)只使用PDM內建規則,PMD也可以找到你程式碼中的一些真正問題。某些問題可能很小,但有些問題則可能很大。PMD不可能找到每個bug,你仍然需要做單元測試和接受測試,在查詢已知bug時,即使是PMD也無法替代一個好的偵錯程式。
- 但是,PMD確實可以幫助你發現未知的問題。
FindBugs
- 1)FindBugs是一個開源的靜態程式碼分析工具,基於LGPL開源協議,無需執行就能對程式碼進行分析的工具。不注重style及format,注重檢測真正的bug及潛在的效能問題 ,尤其注意了儘可能抑制誤檢測(false positives)的發生。以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主要著眼於尋找程式碼中的缺陷,這就與其他類似工具有些區別了,直接操作類檔案(class檔案)而不是原始碼。
- 2)FindBugs可以通過命令列、各種構建工具(如Ant、Maven等)、獨立的Swing GUI或是以Eclipse和NetBeans IDE外掛的方式來執行。
- 3)FindBugs輸出結果既可以是XML的,也可以是文字形式的。
- 4)開發者可以通過多種方式來使用FindBugs,最常見的是在新編寫模組的程式碼分析以及對現有程式碼進行更大範圍的分析。
- 5)不注重style及format,注重檢測真正的bug及潛在的效能問題,尤其注意了儘可能抑制誤檢測(false positives)的發生。
- 4)FindBugs可檢測的bug pattern舉例:檢測java programing中容易陷入的bug pattern,equals() 實現時的一般規約違反Null pointer的參照 ,Method的返回值的check遺漏 ,初始化前field的訪問,Multi-thread的正確性, 同期化處理的矛盾, 無條件的wait(), Code的脆弱性 ,可以變更的靜態object ,內部數列參照的return等
Checkstyle
- 1)定義: Checkstyle是一款檢查Java程式原始碼樣式的工具。
- 2)特點:
- 1)它可以有效的幫助我們檢視程式碼以便更好的遵循程式碼編寫標準,特別適用於小組開發時彼此間的樣式規範和統一。
- 2)Checkstyle提供了高可配置性,以便適用於各種程式碼規範,所以除了使用它提供的幾種常見標準之外,你也可以定製自己的標準。
- 3)Checkstyle提供了支援大多數常見IDE的外掛,大部分外掛中就含有最新的Checkstyle,就不用費心再部署一份了。
- 4)Checkstyle可以檢查程式碼的很多方面,從傳統觀點看,它主要是用來檢查程式碼層面的,自從第三版以後,它的內部架構作了重大改變,很多其它意圖的檢測加了進來,現在Checkstyle可以檢查像類設計的問題,重複程式碼,如鎖的雙重檢查的bug模式。
- 3)CheckStyle的主要流程是:
- 1)對Java檔案進行詞法語法分析,生成語法樹。
- 2)載入配置檔案(checkstyle-metadata.xml以及自定義的配置檔案)register check事件。
- 3)按照深度優先遍歷對語法樹進行解析,按照註冊的事件,在到達某些節點( AST ) 時進行style檢查(AST,A child-Sibling Tree,是語法樹中的某個節點,其型別在TokenTypes類中定義。)
- 4)我們所說的自定義Style的檢查,就是在第二步設定的。這裡牽涉到一個叫com.puppycrawl.tools.checkstyle.api.Check 的類,我們通常需要過載其中的兩個函式: public int[] getDefaultTokens()和public void visitToken(DetailAST ast). 這兩個函式的含義為,在遍歷語法樹的過程中,每當到達getDefaultTokens函式所返回的AST型別,程式就進入visitToken進行具體的檢查和分析,即,真正的分析檢查過程是在visitToken中實現的。
Hammurapi
- 1)定義: Hammurapi它是一個開源的程式碼審查/評審(review)工具。它可以幫助改進Java程式碼的質量。它可以基於一套設計規範來分析程式碼庫。當它碰到違反規範的地方,會在報告中標識。就像Checkstyle一樣,它與Ant無縫整合並且由基於XML配置檔案來驅動。
- 2)特點:
- 1)Hammurapi是用來強制程式碼設計規範的。
- 2)Hammurapi是一個遵循設計的工具,提供了自動而且一致的方式來實現設計規範,因此使程式碼評審更加有效而輕鬆。
- 3)Hammurapi如何工作:Hammurapi這樣的程式碼分析工具都帶有語言分析器。語言分析器是一種輸入語言程式碼並輸出抽象語法樹的工具。這個樹上的節點代表語言標識。例如,考慮一下簡單的算術表示式:3+4. 語言分析器會解析他成為一個如圖5所示的語法樹。在這個樹中,節點+代表操作符標識。節點3和4是運算元標識Hammurapi使用ANTLR(另一個語言識別工具)作為語言分析器。然而ANTLR API是相當底層的。為改善可用性,Hammurapi使用另一個API,基於ANTLR 的JSEL(Java源程式工程類庫),來訪問抽象語法樹。 一旦樹構建完成,一種樹遍歷演算法就被用來訪問樹中每一個節點。每次訪問到一個節點,一種回撥機制(Visitor模式)被用來提示相應的檢查器。在這些回撥方法中,檢查器收集相關的資訊來確定是否有違反規範的地方存在。
Lint4j
- 1)定義:Lint4J是一個針對Java的原始碼分析工具,它可以對Java原始碼和位元組碼進行靜態分析,判斷其中是否存在死鎖、效能問題或者伸縮性問題。它可以整合到任何IDE種或構建系統
- 2)特點:
- 1)檢測程式碼語法規則
- 2)潛在的bug
- 3)檢測編碼模式對程式碼可讀性及大小的影響
- 4)檢測是否違反EJB規範
Sonar
- 1)定義:程式碼質量管理工具Sonar提供了設計與架構度量。Sonar 2.0引入了針對Java應用的設計分析、架構與面向物件的度量,Sonar 2.1可以檢測到未使用的方法以及對不建議使用方法的呼叫。是一個集成了CheckStyle,PMD,Findbugs的程式碼校驗規則 ,重複程式碼發現,程式碼測試覆蓋率, 程式碼註釋率,及所有的檢測率變化追蹤的完美程式碼質量檢查工具。它包含了程式碼質量檢測的七個方面
- 2)特點:
- 1)程式碼覆蓋:通過單元測試,將會顯示哪行程式碼被選中。
- 2)改善編碼規則。
- 3)搜尋編碼規則:按照名字,外掛,啟用級別和類別進行查詢。
- 4)專案搜尋:按照專案的名字進行查詢。
- 5)對比資料:比較同一張表中的任何測量的趨勢。
- 6)單元測試
- 3)Sonar2.1:
- Sonar還基於Squid引入了一個全新的規則引擎、Sonar解析器既可以處理原始碼,也可以處理位元組碼,解析器帶有內建的規則,可以檢測未使用的私有與保護方法以及客戶端對不建議使用的方法的呼叫。Squid通過分析應用原始碼、Java API和外部程式庫的位元組碼來決定哪些方法、類和屬性是不建議使用的。
- Sonar 2.1的新特性:
- 1)一個全新的“Libraries”頁面,顯示了專案中所有的程式庫和依賴,該特性要求使用Maven來構建專案。一旦在Sonar站點的主頁上選擇了一個專案,該服務就會以視覺化的樹形結構展示出專案依賴。此外,還有一個可選的動態過濾器,可以根據名稱過濾程式庫以便在應用的依賴間導航。
- 2)用於搜尋程式庫使用情況的“Dependencies”頁面。比如說,可以搜尋到使用了第三方框架如Commons Logging 1.1的所有專案。
- 3)可以使用各種外掛擴充套件Sonar的功能。現在有一個全新的“System Info”頁面顯示了系統屬性、已裝外掛和Java虛擬機器記憶體統計資訊。該頁面還給出了關於Sonar配置和資料庫統計的詳細資訊。
- 4)一個用於管理已裝外掛和系統資訊的管理控制檯。最新版的Sonar為這些外掛引入了一個測試框架和一個客戶化的Maven生命週期管理工具。它還帶有一個用於整合專案事件的Web Service並在專案的size widget中增加了一個新的度量模組。
JDepend
- 1)JDepend一個開放原始碼的可以用來評價Java程式質量的優秀工具,它遍歷Java class的檔案目錄,以Java包(package)為單位,為每一個包/類自動生成 包的依賴程度,穩定性,可靠度等的評價報告,根據這些報告,我們可以得到包或類之間的依賴關係,並分析出包的穩定程度,抽象程度,是否存在迴圈依耐關係等 。可以根據JDepend給出的報告資料,分析出我們的包是否是可靠的,穩定的,健壯的包,是否符合面向物件的設計原則。
- 2)特點:
- 1)評價設計質量
- 2)翻轉依賴性
- 3)支援並行開發和極限程式設計
- 4)獨立的釋出模組
- 5)識別package的迴圈依賴
- 3)Depend生成的Java包的質量評價報告主要包括:
- 1)Number of Classes and Interfaces:實現類與抽象介面的數目
- 2)Abstractness (A):包的抽象度。指一個包內包含的抽象類或接口占整個包中的類的比重。
- 3)Afferent Couplings (Ca):向心耦合。依賴該包(包含的類)的外部包(類)的數目(i.e. incoming dependencies),該數值越大,說明該包的擔當的職責越大,也就越穩定。
- 4)Efferent Couplings (Ce):離心耦合。被該包依賴的外部包的數目(i.e. outgoing dependencies),該數值越大, 說明該包越不獨立(因為依賴了別的包),也越不穩定。
- 5)Instability (I):衡量一個包的不穩定程度。I=Ce/(Ce+Ca)。它的值處於[0,1]之間。I=0時說明包是最穩定的,反之I=1則說明包極不穩定。
- 6)Distance from the Main Sequence (D): 該指標主要用來評價包的抽象程度與穩定程度的平衡關係,它可以用二維直線圖 A + I = 1 來表示。
- 7)Package Dependency Cycles:包的迴圈依賴度。
IBM Checking Tool for Bugs Errors and Mistakes(簡稱BEAM)
- 1) 定義:是 IBM 開發的一個靜態分析工具,可以用於分析並查找出 C, C++ 和 Java程式碼中的一些不容易發現的潛在錯誤,從而達到提高程式碼質量的目的。同動態分析工具和其它靜態分析工具相比,它擁有一些可貴的特性。
- 2)特點:
- 1)對程式碼進行語法掃描,通過演算法對程式碼進行檢查分析
- 2)和一些 bug 模式進行比較,最終標明問題區域,輸出分析結果
- 3)使用了額外的定理證明(theorem proving)技術來判斷一個潛在的錯誤是否是真正的錯誤,從而減輕了程式設計師判斷錯誤真偽所需的工作量
LDRA Testbed
- 1)定義:LDRA Testbed為應用軟體的確認和驗證提供強大的原始碼測試和分析功能,是獨特的質量控制工具。 它有助於提高計算機軟體必需的可靠性,健壯性和儘可能的零缺陷,它的使用帶來時間、成本和效率上真實的節省,這些都是無法衡量其價值的。它是強大和完整的整合工具包,使先進的軟體分析技術應用在開發生命週期的關鍵階段。
- 2)LDRA Testbed提供強大的分析功能,用於兩個主要的測試領域,靜態分析和動態分析。
- 1)靜態分析: 分析程式碼,並且提供對程式碼結構的理解。
- 2)動態分析: 利用原始碼的插裝版本,使用測試資料執行,在執行時發現軟體缺陷
- 3) 使用LDRA testbed 的好處軟體開發和測試過程的成本效率分析工具單元、整合和系統測試的理想工具貫穿於軟體開發的整個生命週期LDRA Testbed應用於許多不同的領域過程改進軟體測試軟體維護
- LDRA Testbed的優點:
- 改進軟體質量
- 定位軟體缺陷
- 強制執行工業標準
- 減少維護費用40%以上
- 減少開發和測試成本75%以上
- 通過自動化過程提高員工動力
Yasca
- 1) 定義:Yasca是一個開源靜態程式碼分析工具外掛框架, 整合流行的多語言靜態分析工具如findbugs/pmd/jlint/rats/cppcheck,由於外掛本身多樣故可支援java c++等語言靜態分析.Yasca是一個用來尋找安全漏洞,在程式的原始碼中檢測程式碼質量、效能以及一致性的軟體。它集成了其他開源專案,其中包括FindBugs PMD ,JLint , Cppcheck ,並掃描某些檔案型別,以及自定義掃描書面的Yasca 這是一個命令列工具,與報告中生成的HTML , CSV格式, XML,SQLite ,和其他格式。
參考: