源碼分析工具
『壹』 有哪些好用的linux源代碼分析工具
dw吧 我一直都用的這個
『貳』 我想學習學習apache源碼 ,但是不知道從哪裡開始,包括源碼分析工具啊等等。求高手解答,重謝!
預備知識:C編程,Linux系統編程。
首先從Web伺服器功能上,整體架構上了解Apache,推薦書《Apache源代碼情景分析》,從Main函數開始看起。Apache的代碼寫了20多年了,做好心裡准備。內存管理和MPM模塊是亮點。
『叄』 高分求個c/c++的源代碼分析工具,能生成流程圖什麼的。
Crystal FLOW for C
Crystal FLOW for C++
能生成流程圖
『肆』 推薦一個好用的C/C++語言代碼分析工具,可以看程序結構的
Visual studio 6.0 Visual studio 2005 Visual studio 2008都可以。
目前我使用的是 Visual studio 2008。
『伍』 android源碼分析工具有哪些
估計題主是要看一個Android項目的源碼,不是Android的源碼。
那就Eclipse或者Android Studio。
再去找java生成UML的插件。據我之前用過的效果來看,效果十分差。
所以我推薦的辦法是把軟體先跑起來,然後通過應用入口一步一步去分析。
如果題主說的是Android源碼,請移步這里大牛們是怎麼閱讀 Android 系統源碼的?
如果搞Andoid 就相信google,Android studio可以滿足你的一切要求,現在沒啥人用eclipse了,source insight 就更不用說了。太笨了。至於桌看這個系統源碼,Android Studio貌似也可以,不過因為我電腦有些問題,我用的window系統,,沒法編譯系統,造成導入有些問題。
『陸』 請問visual studio 2010如何調出代碼分析工具
我的是VS2005簡體中文版
添加步驟如下
右擊 頂部 工具欄 或 菜單欄 空白處--》選擇 最後一項 「自定義...」
在 「自定義」對話框中 選擇 「命令(C)」頁面 有個 「重排命令(R)...」
重排命令 窗口中 單項選擇 菜單欄 右邊 選擇 「調試 | 窗口」
使用 下面 的 「添加(A)」 ,在彈出的「添加命令」對話框 中 左側 選擇 「調試」, 右側 就是 所有的調試 命令 ,任你 添加,裡麵包含了 「內存」
『柒』 linux系統有沒有源碼分析工具
代碼的分析工具有很多,推薦使用 source insight 這個軟體,支持多種語言,代碼跳轉,結構圖等功能非常強大。
『捌』 怎樣把一個軟體解析成源碼
源程序,有人又稱源代碼!
指的是所用程序的原始代碼!是軟體或是游戲的最初始的代碼的集合!
和一般的程序相比,源程序具有最初始性,不可生成性!
比如你現在看的這個網頁,可以通過點擊滑鼠右鍵→查看源文件的方法查看該網頁的程序!但這個程序就不是源程序,是通過網頁伺服器的網頁服務的源程序所生產組裝的程序!
通常某些源程序是很隱秘的,,能創造巨大的經濟效應!比如WINDOWS的源程序,如果有人能拿到,那肯定可以賣個好價錢!
總之,程序可以由源程序來生成,但源程序只能有人來進行編寫!如果你不太確定收件箱中的某封電子郵件或某個需要瀏覽的網站頁面是否附帶了病毒時,可以通過「查看源文件」的方式,查看後台HTML源代碼。如果源文件中顯示的URL與真實的鏈接無法匹配,那說明該郵件或網頁有問題。 如果「查看源文件」這一功能無法使用了,確實是件很麻煩的事情。導致該問題出現的原因有很多,下面將一一列舉:
第一類情況是,當瀏覽器的緩存被裝滿時,「查看源文件」功能將失效。如果你想確定自己的電腦是否屬於這類情況,可以點擊IE的「工具」菜單中的「Internet選項」 「常規」標簽,然後,再點擊「Internet臨時文件」一欄中的「刪除文件」按鈕。
第二類情況,當你打開某些特殊的瀏覽器窗口(比如說用JavaScript腳本語言編寫的網頁)時,「查看源文件」功能也會失效。如果你在瀏覽任何網頁時,都無法「查看源文件」,那就不屬於這類情況。
第三類情況,當一個網頁還沒有被完全載入到桌面時,「查看源文件」功能也是不能使用的(在這種狀態下,「文件」菜單中的「另存為」選項也是屏蔽的)。這也算不上是真正的問題。
第四類情況,查看Windows文件夾,如果找不到Notepad.exe,將會導致「查看源文件」功能無法使用。
第五類情況,如果TEMP(或TMP)環境變數指向某一個不存在的文件夾,也會導致「查看源文件」功能無法使用。打開命令提示符(command prompt)窗口,鍵入SET TEMP(或SET TMP),就可以查看到這些變數的值。
第六類情況,通過注冊表設置也可以限定命令行的有效性。首先,點擊「開始」菜單,在運行對話框中鍵入「REGEDIT」,調出注冊表編輯器,點擊「HKEY_CURRENT_USERSoftware PoliciesMicrosoftInternet Explorer Restrictions」,在右邊的窗格中找到一個名為NoViewSource的值,如果當前的數值數據設置為1,則雙擊它,將數值數據更改為0。
第七類情況,通過查看注冊表設置,你還會發現:如果指定的調用程序不正確,也將導致「查看源文件」功能失靈。調出注冊表編輯器,點擊「HKEY_LOCAL_MACHINESoftware MicrosoftInternet ExplorerView Source EditorEditor Name」,如果該鍵存在的話,右邊窗格中所顯示的默認的「數值名稱」應該是記事本程序的完整路徑,一般以「C:windowsnotepad.exe」的形式表示。如果該鍵不存在,先核實記事本程序的正確位置,然後雙擊默認鍵值,修改錯誤路徑。
第八類情況,組策略的設置也有可能會屏蔽「查看源文件」這一菜單項。從「開始」菜單中調出「運行」對話框,鍵入GPEDIT.MSC。如果桌面上彈出一個提示框,提示該文件名不正確,則說明「查看源文件」功能的失效與組策略的設置無關;否則,桌面上將會彈出一個「組策略編輯器」窗口,點擊「User ConfigurationAdministr-ativeTemplatesWindows ComponentsInternet ExplorerBrowser」,在右邊的窗格中找到View menu: Disable Source menu,如果這個鍵值被設置為「Enabled」,則將它更改為「Disabled」。
注意,上面介紹的第一類情況(即由於IE所保存的Internet臨時文件過多而造成「查看源文件」功能失靈)是最常見的。如果刪除了所有離線內容之後,該功能仍然無法使用,你再依次檢查後面所介紹的幾種可能性,直到問題消除為止。
『玖』 Z80匯編代碼分析工具或者反匯編分析工具
這個恐怕沒有吧?
當年都沒有用PC機的,太昂貴了。
都是用人工編譯成機器碼,以及反編譯。
『拾』 做靜態代碼分析都是用那個軟體的
本文首先介紹了靜態代碼分析的基本概念及主要技術,隨後分別介紹了現有 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 靜態代碼分析理論基礎和主要技術
缺陷模式匹配:缺陷模式匹配事先從代碼分析經驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行模式匹配,從而完成軟體的安全分析。這種方式的優點是簡單方便,但是要求內置足夠多缺陷模式,且容易產生誤報。
類型推斷:類型推斷技術是指通過對代碼中運算對象類型進行推理,從而保證代碼中每條語句都針對正確的類型執行。這種技術首先將預定義一套類型機制,包括類 型等價、類型包含等推理規則,而後基於這一規則進行推理計算。類型推斷可以檢查代碼中的類型錯誤,簡單,高效,適合代碼缺陷的快速檢測。
模型檢查:模型檢驗建立於有限狀態自動機的概念基礎之上,這一理論將被分析代碼抽象為一個自動機系統,並且假設該系統是有限狀態的、或者是可以通過抽象歸 結為有限狀態。模型檢驗過程中,首先將被分析代碼中的每條語句產生的影響抽象為一個有限狀態自動機的一個狀態,而後通過分析有限狀態機從而達到代碼分析的 目的。模型檢驗主要適合檢驗程序並發等時序特性,但是對於數據值域數據類型等方面作用較弱。
數據流分析:數據流分析也是一種軟體驗證技術,這種技術通過收集代碼中引用到的變數信息,從而分析變數在程序中的賦值、引用以及傳遞等情況。對數據流進行 分析可以確定變數的定義以及在代碼中被引用的情況,同時還能夠檢查代碼數據流異常,如引用在前賦值在後、只賦值無引用等。數據流分析主要適合檢驗程序中的 數據域特性。
- 圖 1. 使用 Checkstyle 進行編碼風格檢查
- 圖 2. 使用 Checkstyle 添加自定義代碼檢查規范
- 圖 3. 使用 FindBugs 進行靜態代碼分析
- 圖 4. 使用 FindBugs 添加自定義代碼檢查規范
- 圖 5. 使用 PMD 進行靜態代碼分析
- 圖 6. 使用 PMD 添加自定義代碼檢查規范
- 圖 7. 使用 Jtest 進行靜態代碼分析
- 圖 8. 使用 Jtest 添加自定義代碼檢查規范
- 表 1. 不同工具的分析對象及應用技術對比
Javadoc 注釋:檢查類及方法的 Javadoc 注釋
命名約定:檢查命名是否符合命名規范
標題:檢查文件是否以某些行開頭
Import 語句:檢查 Import 語句是否符合定義規范
代碼塊大小,即檢查類、方法等代碼塊的行數
空白:檢查空白符,如 tab,回車符等
修飾符:修飾符號的檢查,如修飾符的定義順序
塊:檢查是否有空塊或無效塊
代碼問題:檢查重復代碼,條件判斷,魔數等問題
類設計:檢查類的定義是否符合規范,如構造函數的定義等問題
Bad practice 壞的實踐:常見代碼錯誤,用於靜態代碼檢查時進行缺陷模式匹配
Correctness 可能導致錯誤的代碼,如空指針引用等
國際化相關問題:如錯誤的字元串轉換
可能受到的惡意攻擊,如訪問許可權修飾符的定義等
多線程的正確性:如多線程編程時常見的同步,線程調度問題。
運行時性能問題:如由變數定義,方法調用導致的代碼低效問題。
可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句
未使用代碼(Dead code):檢查未使用的變數,參數,方法
復雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環
重復的代碼:檢查重復的代碼
循環體創建新對象:檢查在循環體內實例化新對象
資源關閉:檢查 Connect,Result,Statement 等資源使用之後是否被關閉掉
可能的錯誤:如內存破壞、內存泄露、指針錯誤、庫錯誤、邏輯錯誤和演算法錯誤等
未使用代碼:檢查未使用的變數,參數,方法
初始化錯誤:內存分配錯誤、變數初始化錯誤、變數定義沖突
命名約定:檢查命名是否符合命名規范
Javadoc 注釋:檢查類及方法的 Javadoc 注釋
線程和同步:檢驗多線程編程時常見的同步,線程調度問題
國際化問題:
垃圾回收:檢查變數及 JDBC 資源是否存在內存泄露隱患
- 清單 1. Test.java 示例代碼
- package Test;import java.io.*;public class Test {/** * Write the bytes from input stream to output stream. * The input stream and output stream are not closed. * @param is * @param os * @throws IOException */public boolean (InputStream is, OutputStream os)throws IOException {intcount = 0;//缺少空指針判斷byte[] buffer =new byte[1024];while((count = is.read(buffer)) >= 0) {os.write(buffer,0, count);}//未關閉I/O流returntrue;}/** * * @param a * @param b * @param ending * @return the elements from a to b, and stop when meet element ending */publicvoid (String[] a, String[] b, String ending){intindex;String temp =null;//空指針錯誤System.out.println(temp.length());//未使用變數intlength=a.length;for(index=0; index&a.length; index++){//多餘的if語句if(true){//對象比較 應使用equalsif(temp==ending){break;}//缺少 數組下標越界檢查b[index]=temp;}}}/** * * @param file * @return file contents as striwww.fltbj.cn#ll if file does not exist */public void readFile(File file) {InputStream is =null;OutputStream os =null;try{is =new BufferedInputStream(newFileInputStream(file));os =new ByteArrayOutputStream();//未使用方法返回值(is,os);is.close();os.close();}catch (IOException e) {//可能造成I/O流未關閉e.printStackTrace();}finally{//空的try/catch/finally塊}}}
- 通過以上測試代碼,我們對已有 Java 靜態代碼分析工具的檢驗結果做了如下比較,如下表 2 所示。
現有主流 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:
FindBugs:
PMD:
Jtest
錯誤檢查能力
為比較上述 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 靜態分析工具,並幫助他們根據需求選擇合適的工具。