1. 軟體工程 靜態測試的主要方法有哪些
(1)人工檢測:是指不依靠計算機而是靠人工審查程序或評審軟體,包括代碼檢查、靜態結構分析和代碼質量度量等;
(2)計算機輔助靜態分析:利用靜態分析工具對被測試程序進行特性分析,從程序中提取一些信息,以便檢查程序邏輯的各種缺陷和可疑的程序構造。
靜態測試包括代碼檢查、靜態結構分析、代碼質量度量等。它可以由人工進行,充分發揮人的邏輯思維優勢,也可以藉助軟體工具自動進行。
(1)二進製程序靜態分析擴展閱讀:
代碼檢查包括代碼走查、桌面檢查、代碼審查等,主要檢查代碼和設計的一致性,代碼對標準的遵循、可讀性,代碼的邏輯表達的正確性,代碼結構的合理性等方面;可以發現違背程序編寫標準的問題,程序中不安全、不明確和模糊的部分,找出程序中不可移植部分、違背程序編程風格的問題,包括變數檢查、命名和類型審查、程序邏輯審查、程序語法檢查和程序結構檢查等內容。
在實際使用中,代碼檢查比動態測試更有效率,能快速找到缺陷,發現30%~70%的邏輯設計和編碼缺陷;代碼檢查看到的是問題本身而非徵兆。但是代碼檢查非常耗費時間,而且代碼檢查需要知識和經驗的積累。
代碼檢查應在編譯和動態測試之前進行,在檢查前,應准備好需求描述文檔、程序設計文檔、程序的源代碼清單、代碼編碼標准和代碼缺陷檢查表等。靜態測試具有的發現缺陷早、降低返工成本、覆蓋重點和發現缺陷的概率高的優點以及耗時長、不能測試依賴和技術能力要求高的缺點。
2. 動態調試和靜態調試是什麼意思有什麼區別
動態調試是指軟體作者利用集成環境(IDE)自帶的調試器跟蹤自己軟體的運行,來協助解決自己軟體的錯誤。 要成為一位優秀的軟體工程師,調試能力是不可或缺的。
動態調試技術在軟體逆向工程領域也是一個很熱門的概念,它是與靜態分析技術相對而言的。靜態分析技術是指破解者利用反匯編工具將二進制的可執行文件翻譯成匯編代碼,通過對代碼的分析來破解軟體;而動態調試則是指破解者利用調試器跟蹤軟體的運行,尋求破解的途徑。
3. 什麼是二進制分析
二進制分析創建了一種行為模式,該模式通過利用可運行的機器代碼分析應用程序的控制和數據流得到的,是一種攻擊者可以識別的方式。與源代碼分析工具不同,這種方法精確地檢測導致核心應用程序和覆蓋范圍擴展在第三方庫、預包裝組件、編譯器或平台的具體說明引進代碼的漏洞。
關於二進制分析,我要推薦Veracode的專利技術——靜態二進制分析,它使企業可以在一個易於使用的平台上進行應用程序的安全診斷,作為企業正式軟體的發布、驗證或驗收過程的一部分。這無需提供源代碼或其他知識產權。
4. 什麼是軟體測試的靜態分析
靜態分析,是相對動態說的,即不運行程序。
使用的工具主要是你的眼睛,常用在文檔測試、白盒測試(代碼審查/走查)、UI界面測試。
靜態測試,通過評審文檔、閱讀代碼等方式測試軟體稱為靜態測試,通過運行程序測試軟體稱為動態測試。
(4)二進製程序靜態分析擴展閱讀:
簡單地說就是抽象了時間因素和具體變動的過程,靜止地孤立地考察某些經濟現象。它一般用於分析經濟現象的均衡狀態以及有關經濟變數達到均衡狀態所需要的條件。 常用的靜態分析法有:相對數分析法、平均數分析法、比較分析法、結構分析法、因素替換分析法、綜合計算分析法、價值系數分析法等。
5. 程序靜態分析的分析技術及實踐
程序靜態分析(Program Static Analysis)可以幫助軟體開發人員、質量保證人員查找代碼中存在的結構性錯誤、安全漏洞等問題,從而保證軟體的整體質量。還可以用於幫助軟體開發人員快速理解文檔殘缺的大規模軟體系統以及系統業務邏輯抽取等系統文檔化等領域。 如開發20年以上的金融核心COBOL系統,動輒上千萬行代碼的系統規模。對於理解這樣規模的系統,基於程序靜態分析的輔助理解工具就能發揮積極作用。
本文首先對程序靜態分析的特點、常用靜態分析技術、靜態分析實現方式進行描述,然後通過一個實例講解了程序靜態分析的執行過程。 程序靜態分析是與程序動態分析相對應的代碼分析技術,它通過對代碼的自動掃描發現隱含的程序問題,主要具有以下特點:
(1)不實際執行程序。動態分析是通過在真實或模擬環境中執行程序進行分析的方法,多用於性能測試、功能測試、內存泄漏測試等方面。與之相反,靜態分析不運行代碼只是通過對代碼的靜態掃描對程序進行分析。
(2)執行速度快、效率高。目前成熟的代碼靜態分析工具每秒可掃描上萬行代碼,相對於動態分析,具有檢測速度快、效率高的特點。
(3)誤報率較高。代碼靜態分析是通過對程序掃描找到匹配某種規則模式的代碼從而發現代碼中存在的問題,例如可以定位strcpy()這樣可能存在漏洞的函數,這樣有時會造成將一些正確代碼定位為缺陷的問題,因此靜態分析有時存在誤報率較高的缺陷,可結合動態分析方法進行修正。 (1)詞法分析:從左至右一個字元一個字元的讀入源程序,對構成源程序的字元流進行掃描,通過使用正則表達式匹配方法將源代碼轉換為等價的符號(Token) 流,生成相關符號列表,Lex為常用詞法分析工具。
(2)語法分析:判斷源程序結構上是否正確,通過使用上下文無關語法將相關符號整理為語法樹, Yacc為常用工具。
(3)抽象語法樹分析:將程序組織成樹形結構,樹中相關節點代表了程序中的相關代碼,目前已有javacc/ Antlra等抽象語法樹生成工具。
(4)語義分析:對結構上正確的源程序進行上下文有關性質的審查。
(5)控制流分析:生成有向控制流圖,用節點表示基本代碼塊,節點間的有向邊代表控制流路徑,反向邊表示可能存在的循環;還可生成函數調用關系圖,表示函數間的嵌套關系。
(6)數據流分析:對控制流圖進行遍歷,記錄變數的初始化點和引用點,保存切片相關數據信息。
(7)污點分析:基於數據流圖判斷源代碼中哪些變數可能受到攻擊,是驗證程序輸入、識別代碼表達缺陷的關鍵。
(8)無效代碼分析,根據控制流圖可分析孤立的節點部分為無效代碼。
程序靜態分析是在不執行程序的情況下對其進行分析的技術,簡稱為靜態分析。而程序動態分析則是另外一種程序分析策略,需要實際執行程序。大多數情況下,靜態分析的輸入都是源程序代碼,只有極少數情況會使用目標代碼。靜態分析這一術語一般用來形容自動化工具的分析,而人工分析則往往叫做程序理解。
靜態分析越來越多地被應用到程序優化、軟體錯誤檢測和系統理解領域。Coverity Inc.的軟體質量檢測產品就是利用靜態分析技術進行錯誤檢測的成功代表。國內某軟體公司的閃蝶(BlueMropho)代碼分析平台,是利用程序靜態分析技術專注於大型機遺留系統的代碼理解領域,尤其擅長分析千萬行代碼規模級的COBOL系統。
6. hex文件轉換成C語言
文件有兩種,一種是文本文件,一種是程序二進制文件,不管哪種文件都可以用十六進制編碼來顯示,稱為hex文件。
1、文本Hex文件一般不需要轉成C語言,更多的是程序二進制文件,用十六進制顯示,可以轉換成C語言,一般使用相應的反匯編程序來實現,這方面的工具很多,不同的平台略有不同。Windows平台一般常用的OllyDbg、Windbg、IDA,Linux平台使用最多的是GDB和Linux版的IDA。
OllyDbg,簡稱OD,一般是軟體逆向工程愛好者,最先使用的一個工具,但是因為當下不在更新,所以一般用一般用於學習使用,下圖中左上角的區域即為反匯編區域 ,用戶可以根據匯編指令,分析程序演算法,然後自己編寫代碼。
通過這個實例 ,相信應該能理解一個大致的流程啦。
7. 如何使用JVisualVM進行性能分析
1、本地機器的程序直接可以監聽到
2、遠程機器的程序需要加上JVM參數
-Dcom.sun.management.jmxremote=
true
-Dcom.sun.management.jmxremote.port=
9090
-Dcom.sun.management.jmxremote.ssl=
false
-Dcom.sun.management.jmxremote.authenticate=
false
備註:另外需要檢查
hostname –i
看解析出來是否為本地的IP,如是127.0.0.1或者IP為多個IP中之一,則其他的IP無效,會連接不上。
這里有個分析案例,利用jvisualvm分析tomcat的問題:
http://blog.tty.nl/2010/09/03/using-visualvm-to-fix-live-tomcat-and-jvm-problems
插件安裝
tools->plugin->Available Plugin 會有值得安裝的插件,如:VisualGC
JConsole
插件列表:https://visualvm.dev.java.net/plugins.html
注意:上面提供的埠配置有些麻煩,不如直接這樣做:
要使用 VisualGC
必須在遠程機上啟動jstatd代理程序,否則會顯示 「not supported for this jvm」 錯誤
而啟動 jstatd 時會有一個許可權問題,需要做如下修改:
nano /opt/sun-jdk-
1.6
.
0.26
/jre/lib/security/java.policy
Java代碼
nano /opt/sun-jdk-1.6.0.26/jre/lib/security/java.policy
增加下列行
Java代碼
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
然後啟動 jstatd並且不要關閉
如:
Threads
查看線程的運行情況,運行、停止、睡眠、等待,根據這些結合實際程序運行的邏輯分析。
找到可疑份子,可以Thread Dump 找出具體是哪個線程在作祟。
參看這個例子:http://blog.tty.nl/2010/09/03/using-visualvm-to-fix-live-tomcat-and-jvm-problems
profile
關於如何使用,如何分析程序,可以參看這個例子:http://www.baptiste-wicht.com/2010/07/profile-applications-java-visualvm/
8. 程序靜態分析的著名的靜態分析工具
雨田靜態分析系統V2.1
產品介紹
簡介
雨田靜態分析系統是擁有獨立知識產權的國產軟體,能夠對.c/.cpp文件進行靜態分析。主要分析內容包括控制流分析、數據流分析、基本度量指標的計算、編碼規則的違反情況檢查等。在對文件進行詳盡分析基礎上,結合系統特有的質量模型,雨田靜態分析系統對被分析的代碼進行了綜合質量評估,以直觀的形式顯示編碼的質量水平。系統提供了內容豐富的靜態分析結果和多角度的質量分析報告,為對編碼進行有效評估提供重要的參考,也為解決代碼中存在的問題提供明確的線索,進而促進軟體質量得到有效地改善與提高。
特點
指標豐富
雨田靜態分析系統詳細計算了代碼相關指標、注釋信息相關指標、數據流相關指標、復雜度相關指標、循環相關指標、操作符及操作數指標、路徑指標等多個方面的指標,為對代碼質量進行有效的評價提供堅實的基礎。
規則全面
雨田靜態分析系統以MISRA為基礎,結合眾多c語言專家的研究成果以及多名資深c/c++開發人員的經驗,提煉出了300餘條可檢查的質量規則,從代碼的正確性、健壯性、可讀性、語義唯一性、環境兼容性等多個方面對之進行詳盡地檢查,輔助開發及測評人員查找代碼中的問題。
功能緊湊、簡單易用
雨田靜態分析系統力求以最簡潔的方式提供最實用的分析結果。用戶僅僅需要執行「打開」操作,就可以查看工程中所有源文件的度量指標、相關代碼、控制流圖、以及規則檢查結果等重要信息。在執行一次「綜合質量分析」操作,就可以查閱工程中所有源文件及其逐函數的指標匯總報告、規則檢查報告、可讀性報告、可維護性報告、可測試性報告以及質量評估報告等眾多分析報告。
使用靈活
雨田靜態分析系統允許用戶選擇語法分析策略、分析報告內容以及編碼規則,還允許用戶調整相關編碼規則的邊界(閥值),從而使之成為自己特定的編碼規則。藉助於自身具備的靈活性,雨田靜態分析系統盡可能的適應用戶的應用環境。
主要功能
控制流分析
通過對c語言及c++語言的順序結構、選擇結構和循環結構等類型代碼塊自身及相互關系的詳盡分析,從而獲取被測文件中每個函數及類方法對應的控制流圖。通過對文件中函數間調用關系的分析,系統能夠獲取文件內函數間的調用關系;通過對文件中類對象的使用情況分析,可以獲得文件中的類關系圖。
數據流分析
系統對全局變數、類屬性、函數參數、局部變數等數據載體進行了其所在的作用域內的
詳盡的數據分析,對函數間的調用關系及數據傳遞也進行了必要的分析,從而能夠以靜態的視角把握文件中每個變數的數據變化過程,為後續的同數據流相關指標計算及代碼質量檢查打下了堅實的基礎。
基本指標計算
基於對文件中代碼進行分析而獲取的數據,雨田靜態分析系統從代碼、注釋、數據流、
路徑、復雜度、循環、操作符及操作數等多個角度計算出相應的指標。
規則檢查
系統以 MISRA編碼規則為依據,系統分析了三百餘條最常見的編碼問題。對於檢查出的問題,系統會給出問題發生的位置,原因以及對應的規則,方便用戶查證並改進。
綜合質量評估
通過對計算出的指標以及查找出的違反編碼規則信息的分類、甄別,根據相關信息在代碼綜合質量中的影響程度,雨田靜態分析系統從可讀性、可維護性以及可測試性等三個角度對文件整體、類整體、逐函數等不同層級的代碼進行了綜合質量評定,並給出直觀的分類評價報告及綜合評價報告,
9. 靜態分析是指
經濟領域概念
靜態分析是一種分析經濟現象的均衡狀態以及有關的經濟變數達到均衡狀態所需要條件的分析方法。[1]而不考慮經濟現象達到均衡狀態的過程,它完全抽象掉了時間因素和具體的變化過程,是一種靜止地、孤立地考察某種經濟事物的方法。
網路
靜態分析
經濟領域概念
靜態分析是一種分析經濟現象的均衡狀態以及有關的經濟變數達到均衡狀態所需要條件的分析方法。[1]而不考慮經濟現象達到均衡狀態的過程,它完全抽象掉了時間因素和具體的變化過程,是一種靜止地、孤立地考察某種經濟事物的方法。
中文名
靜態分析
外文名
static analysis
指標
總量指標、相對指標、平均指標、標志變異指標等
應用
靜態計算機科學、經濟學、工程、力學、機械
釋義
根據既定的外生變數值求得內生變數的分析方法
內涵
靜態分析法是根據既定的外生變數值求得內生變數的分析方法,是對已發生的經濟活動成果,進行綜合性的對比分析的一種分析方法。
如研究均衡價格時,舍掉時間、地點等因素,並假定影響均衡價格的其他因素,如消費者偏好、收入及相關商品的價格等靜止不變,單純分析該商品的供求達於均衡狀態的產量和價格的決定。簡單地說就是抽象了時間因素和具體變動的過程,靜止地孤立地考察某些經濟現象。它一般用於分析經濟現象的均衡狀態以及有關經濟變數達到均衡狀態所需要的條件。
常用的靜態分析法有:相對數分析法、平均數分析法、比較分析法、結構分析法、因素替換分析法、綜合計算分析法、價值系數分析法等。
指標
10. 做靜態代碼分析都是用那個軟體的
本文首先介紹了靜態代碼分析的基本概念及主要技術,隨後分別介紹了現有 4 種主流 Java 靜態代碼分析工具 (Checkstyle,FindBugs,PMD,Jtest),最後從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟體開發人員了解靜態代碼分析工具,並選擇合適的工具應用到軟體開發中。
引言
在 Java 軟體開發過程中,開發團隊往往要花費大量的時間和精力發現並修改代碼缺陷。Java 靜態代碼分析(static code analysis)工具能夠在代碼構建過程中幫助開發人員快速、有效的定位代碼缺陷並及時糾正這些問題,從而極大地提高軟體可靠性並節省軟體開發和測試成 本。目前市場上的 Java 靜態代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現有 4 種主流 Java 靜態代碼分析工具 (Checkstyle,FindBugs,PMD,Jtest),並從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟體開發人員了解靜態代碼分析工具,並選擇合適的工具應用到軟體開發中。
靜態代碼分析工具簡介
什麼是靜態代碼分析
靜態代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結構、過程、介面等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現的空指針引用等等。
在軟體開發過程中,靜態代碼分析往往先於動態測試之前進行,同時也可以作為制定動態測試用例的參考。統計證明,在整個軟體開發生命周期中,30% 至 70% 的代碼邏輯設計和編碼缺陷是可以通過靜態代碼分析來發現和修復的。
但是,由於靜態代碼分析往往要求大量的時間消耗和相關知識的積累,因此對於軟體開發團隊來說,使用靜態代碼分析工具自動化執行代碼檢查和分析,能夠極大地提高軟體可靠性並節省軟體開發和測試成本。
靜態代碼分析工具的優勢
1. 幫助程序開發人員自動執行靜態代碼分析,快速定位代碼隱藏錯誤和缺陷。
2. 幫助代碼設計人員更專注於分析和解決代碼設計缺陷。
3. 顯著減少在代碼逐行檢查上花費的時間,提高軟體可靠性並節省軟體開發和測試成本。
Java 靜態代碼分析理論基礎和主要技術
缺陷模式匹配:缺陷模式匹配事先從代碼分析經驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行模式匹配,從而完成軟體的安全分析。這種方式的優點是簡單方便,但是要求內置足夠多缺陷模式,且容易產生誤報。
類型推斷:類型推斷技術是指通過對代碼中運算對象類型進行推理,從而保證代碼中每條語句都針對正確的類型執行。這種技術首先將預定義一套類型機制,包括類 型等價、類型包含等推理規則,而後基於這一規則進行推理計算。類型推斷可以檢查代碼中的類型錯誤,簡單,高效,適合代碼缺陷的快速檢測。
模型檢查:模型檢驗建立於有限狀態自動機的概念基礎之上,這一理論將被分析代碼抽象為一個自動機系統,並且假設該系統是有限狀態的、或者是可以通過抽象歸 結為有限狀態。模型檢驗過程中,首先將被分析代碼中的每條語句產生的影響抽象為一個有限狀態自動機的一個狀態,而後通過分析有限狀態機從而達到代碼分析的 目的。模型檢驗主要適合檢驗程序並發等時序特性,但是對於數據值域數據類型等方面作用較弱。
數據流分析:數據流分析也是一種軟體驗證技術,這種技術通過收集代碼中引用到的變數信息,從而分析變數在程序中的賦值、引用以及傳遞等情況。對數據流進行 分析可以確定變數的定義以及在代碼中被引用的情況,同時還能夠檢查代碼數據流異常,如引用在前賦值在後、只賦值無引用等。數據流分析主要適合檢驗程序中的 數據域特性。
現有主流 Java 靜態分析工具
Checkstyle
Checkstyle 是 SourceForge 的開源項目,通過檢查對代碼編碼格式,命名約定,Javadoc,類設計等方面進行代碼規范和風格的檢查,從而有效約束開發人員更好地遵循代碼編寫規范。
Checkstyle 提供了支持大多數常見 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下圖 1 所示,Checkstyle 對代碼進行編碼風格檢查,並將檢查結果顯示在 Problems 視圖中。圖中,代碼編輯器中每個放大鏡圖標表示一個 Checkstyle 找到的代碼缺陷。開發人員可通過在 Problems 視圖中查看錯誤或警告詳細信息。
此外,Checkstyle 支持用戶根據需求自定義代碼檢查規范,在下圖 2 中的配置面板中,用戶可以在已有檢查規范如命名約定,Javadoc,塊,類設計等方面的基礎上添加或刪除自定義檢查規范。
FindBugs
FindBugs 是由馬里蘭大學提供的一款開源 Java 靜態代碼分析工具。FindBugs 通過檢查類文件或 JAR 文件,將位元組碼與一組缺陷模式進行對比從而發現代碼缺陷,完成靜態代碼分析。FindBugs 既提供可視化 UI 界面,同時也可以作為 Eclipse 插件使用。文本將主要使用將 FindBugs 作為 Eclipse 插件。在安裝成功後會在 eclipse 中增加 FindBugs perspective,用戶可以對指定 Java 類或 JAR 文件運行 FindBugs,此時 FindBugs 會遍歷指定文件,進行靜態代碼分析,並將代碼分析結果顯示在 FindBugs perspective 的 bugs explorer 中,如下圖 3 所示:
圖中 Bug Explorer 中的灰色圖標處為 Bug 類型,每種分類下紅色圖標表示 bug 較為嚴重,黃色的圖標表示 bug 為警告程度。Propreties 列出了 bug 的描述信息及修改方案。
此外,FindBugs 還為用戶提供定製 Bug Pattern 的功能。用戶可以根據需求自定義 FindBugs 的代碼檢查條件,如下圖 4 所示:
PMD
PMD 是由 DARPA 在 SourceForge 上發布的開源 Java 代碼靜態分析工具。PMD 通過其內置的編碼規則對 Java 代碼進行靜態檢查,主要包括對潛在的 bug,未使用的代碼,重復的代碼,循環體創建新對象等問題的檢驗。PMD 提供了和多種 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式與 Eclipse 集成。如下圖 5 所示:在 Violations Overview 視圖中,按照代碼缺陷嚴重性集中顯示了 PMD 靜態代碼分析的結果。
PMD 同樣也支持開發人員對代碼檢查規范進行自定義配置。開發人員可以在下圖 6 中的面板中添加、刪除、導入、導出代碼檢查規范。
Jtest
Jtest 是 Parasoft 公司推出的一款針對 Java 語言的自動化代碼優化和測試工具,Jtest 的靜態代碼分析功能能夠按照其內置的超過 800 條的 Java 編碼規范自動檢查並糾正這些隱蔽且難以修復的編碼錯誤。同時,還支持用戶自定義編碼規則,幫助用戶預防一些特殊用法的錯誤。Jtest 提供了基於 Eclipse 的插件安裝。Jtest 支持開發人員對 Java 代碼進行編碼規范檢查,並在 Jtask 窗口中集中顯示檢查結果,如下圖 7 所示:
同時,Jtest 還提供了對用戶定製代碼檢查配置甚至自定義編碼規則的支持,這一功能使得開發人員可以基於不同場景定製所需要的編碼規范,如圖 8 所示:
Java 靜態分析工具對比
本章節將從以下幾個方面對上述 Java 靜態分析工具進行比較:
應用技術及分析對象
下表 1 列出了不同工具的分析對象及應用技術對比:
Java 靜態分析工具
分析對象
應用技術
Checkstyle Java 源文件 缺陷模式匹配
FindBugs 位元組碼 缺陷模式匹配;數據流分析
PMD Java 源代碼 缺陷模式匹配
Jtest Java 源代碼 缺陷模式匹配;數據流分析
內置編程規范
Checkstyle:
Javadoc 注釋:檢查類及方法的 Javadoc 注釋
命名約定:檢查命名是否符合命名規范
標題:檢查文件是否以某些行開頭
Import 語句:檢查 Import 語句是否符合定義規范
代碼塊大小,即檢查類、方法等代碼塊的行數
空白:檢查空白符,如 tab,回車符等
修飾符:修飾符號的檢查,如修飾符的定義順序
塊:檢查是否有空塊或無效塊
代碼問題:檢查重復代碼,條件判斷,魔數等問題
類設計:檢查類的定義是否符合規范,如構造函數的定義等問題
FindBugs:
Bad practice 壞的實踐:常見代碼錯誤,用於靜態代碼檢查時進行缺陷模式匹配
Correctness 可能導致錯誤的代碼,如空指針引用等
國際化相關問題:如錯誤的字元串轉換
可能受到的惡意攻擊,如訪問許可權修飾符的定義等
多線程的正確性:如多線程編程時常見的同步,線程調度問題。
運行時性能問題:如由變數定義,方法調用導致的代碼低效問題。
PMD:
可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句
未使用代碼(Dead code):檢查未使用的變數,參數,方法
復雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環
重復的代碼:檢查重復的代碼
循環體創建新對象:檢查在循環體內實例化新對象
資源關閉:檢查 Connect,Result,Statement 等資源使用之後是否被關閉掉
Jtest
可能的錯誤:如內存破壞、內存泄露、指針錯誤、庫錯誤、邏輯錯誤和演算法錯誤等
未使用代碼:檢查未使用的變數,參數,方法
初始化錯誤:內存分配錯誤、變數初始化錯誤、變數定義沖突
命名約定:檢查命名是否符合命名規范
Javadoc 注釋:檢查類及方法的 Javadoc 注釋
線程和同步:檢驗多線程編程時常見的同步,線程調度問題
國際化問題:
垃圾回收:檢查變數及 JDBC 資源是否存在內存泄露隱患
錯誤檢查能力
為比較上述 Java 靜態分析工具的代碼缺陷檢測能力,本文將使用一段示例代碼進行試驗,示例代碼中將涵蓋我們開發中的幾類常見錯誤,如引用操作、對象操作、表達式復雜化、數 組使用、未使用變數或代碼段、資源回收、方法調用及代碼設計幾個方面。最後本文將分別記錄在默認檢查規范設置下,不同工具對該示例代碼的分析結果。以下為 示例代碼 Test.java。其中,代碼的注釋部分列舉了代碼中可能存在的缺陷。
表 2. Java 靜態代碼分析工具對比
代碼缺陷分類
示例
Checkstyle
FindBugs
PMD
Jtest
引用操作 空指針引用 √ √ √ √
對象操作 對象比較(使用 == 而不是 equals) √ √ √
表達式復雜化 多餘的 if 語句 √
數組使用 數組下標越界 √
未使用變數或代碼段 未使用變數 √ √ √
資源回收 I/O 未關閉 √ √
方法調用 未使用方法返回值 √
代碼設計 空的 try/catch/finally 塊 √
由表中可以看出幾種工具對於代碼檢查各有側重。其中,Checkstyle 更偏重於代碼編寫格式,及是否符合編碼規范的檢驗,對代碼 bug 的發現功能較弱;而 FindBugs,PMD,Jtest 著重於發現代碼缺陷。在對代碼缺陷檢查中,這三種工具在針對的代碼缺陷類別也各有不同,且類別之間有重疊。
總結
本文分別從功能、特性和內置編程規范等方面詳細介紹了包括 Checkstyle,FindBugs,PMD,Jtest 在內的四種主流 Java 靜態代碼分析工具,並通過一段 Java 代碼示例對這四種工具的代碼分析能力進行比較。由於這四種工具內置編程規范各有不同,因此它們對不同種類的代碼問題的發現能力也有所不同。其中 Checkstyle 更加偏重於代碼編寫格式檢查,而 FindBugs,PMD,Jtest 著重於發現代碼缺陷。最後,希望本文能夠幫助 Java 軟體開發和測試人員進一步了解以上四種主流 Java 靜態分析工具,並幫助他們根據需求選擇合適的工具。