http://hao.jobbole.com/static_code_analysis_tool_list_opensource_lang/?utm_source=blog.jobbole.com&utm_medium=sidebar-resources
本文是一個靜態代碼分析工具的清單,共有26個工具。包括4個.NET工具、2個Ada工具、7個C++工具、4個Java工具、2個JavaScript工具、1個Opa工具、2個Packaging工具、3個Perl工具、1個Python工具。
1.NET
.NET Compiler Platform(代號 Roslyn)
Roslyn提供有着豐富的代碼分析API的開源C#和Visual Basic編譯器。它可以使用這些Visual Studio裏的API生成代碼分析工具。
- 官網:https://roslyn.codeplex.com/
- GitHub:https://github.com/dotnet/roslyn
- Visual Studio博客介紹:
- https://blogs.msdn.microsoft.com/visualstudio/2011/10/19/introducing-the-microsoft-roslyn-ctp/
CodeIt.Right
CodeIt.Right提供一個快速的自動的方法確保你的源代碼遵循預先定義的設計和風格準則。它通過以下方式使靜態代碼分析進入更高水平:即時代碼審查、及早發現問題、編碼原則、自動代碼審查、集成StyleCop檢查、報告。
FxCop
一個實現.NET靜態代碼分析的圖形用戶接口和命令行工具。
FxCop提供幾百種規則實現各種類型的分析。包括:設計、全球化、互操作性、可維護性、靈活性、命名、性能、可移植性、可靠性、安全性,利用率。FxCop的功能完全集成到Visual Studio2010的高級版和最終版中。
- 最新版本:10.0
- 發佈日期:2010年6月18日
- 官網:https://www.microsoft.com/en-us/download/details.aspx?id=6544
- GitHub:https://github.com/DrShaffopolis/FxCop
- 文檔:https://msdn.microsoft.com/en-us/library/dd264939(v=VS.100).aspx
StyleCop
StyleCop分析C#源代碼,強制執行一系列風格和一致性規則。可以在Visual Studio內部運行,也可以集成到MSBuild項目中。StyleCop還可以被集成到很多第三方開發工具中。
核心原則:
StyleCop通過爲C#代碼強制執行一組通用風格規則來體現價值。StyleCop將繼續利用一個連續的帶有允許的最小規則配置的規則集。開發者可以實現他們自己的規則,只要他們願意。
StyleCop擁有和Visual Studio、MSBuild,TFS等無縫集成的能力。開發者可以自由執行自定義代碼,將StyleCop集成到其他開發和工具環境,如SDK文檔中所述。
- 最新版本:4.7.55
- 發佈日期:2016年11月10日
- 官網:http://stylecop.codeplex.com/
- GitHub:https://github.com/StyleCop
2 Ada
AdaControl
AdaControl是一個免費的(授權)工具,可以檢測Ada程序中使用的各種結構。它的首要目標是控制風格和程序規則的正確使用,但是它也可以作爲一個強大的工具搜索編程風格或設計模式的各種形式。搜索的元素範圍有非常簡單的,比如某種實體、聲明或語句的出現,也有非常複雜的,比如驗證遵守了某種編程模式。
- 最新版本:1.18r9
- 發佈日期:2016年11月10日
- 官網:http://www.adalog.fr/en/adacontrol.html
- Sourceforge:https://sourceforge.net/projects/adacontrol/
Fluctuat
Fluctuat是一抽象解釋器,以數字編程(C或Ada)靜態分析器爲基礎,由CEA-LIST的ME ASI(ModElling and Analysis of Systems in Interaction)實驗室在2001年開發。給出一組輸入和參數,可能帶有不確定因素,它會考慮這個程序所有可能的行爲,無論是真實的還是有限精度下,並描述這些不同的特性。
3 C,C++
BLAST
BLAST(Berkeley Lazy Abstraction Software verification Tool伯克利惰性抽象軟件驗證工具)是一個C語言靜態軟件驗證工具,它可以解決可達性問題,例如是否可以通過一個有效的執行命令從入口點(主程序)到達給定的程序位置。
安全屬性的驗證可能降低到可達性,BLAST常常用於覈查Linux驅動程序驗證項目。
可以在以下網站下載Linux系統的BLAST源代碼或二進制版本。
- 最新版本:2.7.2
- 發佈日期:2014年2月17日
- 官網:http://forge.ispras.ru/projects/blast/
- 文件:http://forge.ispras.ru/projects/blast/files
- 版本庫:http://forge.ispras.ru/projects/blast/repository
Cpplint
這個項目繼續開發cpplint,它是一個C++風格檢查器,遵循Google的C++風格指南。提供的cpplint 爲PYPI(Python Package Index)包,並添加了幾個功能和修復程序。它是google/styleguide的一個分支,希望未來可以合併在一起。
- 最新版本:1.3.0
- 發佈日期:2016年7月13日
- 官網:https://pypi.python.org/pypi/cpplint
- GitHub:https://github.com/google/styleguide/tree/gh-pages/cpplint
Coccinelle
Coccinelle是一個程序匹配和轉換引擎。它提供語意修補程序以便在C代碼中指定期望的匹配和轉換。Coccinelle初始的目的是完成Linux的間接開發。這種開發包括客戶端代碼中所需要的改變,目的是響應庫應用程序接口變化。還可能包括一些修改,例如重命名一個函數、添加一個函數參數,它的值以某種方式被上下文決定、重組數據結構。除了間接開發,Coccinelle還可以成功的尋找和修復系統代碼中的錯誤。
- 最新版本:1.0.6
- 發佈日期:2016年9月27日
- 官網:http://coccinelle.lip6.fr/
- GitHub:https://github.com/coccinelle/coccinelle
Frama-C
Frama-C是一個平臺,致力於分析用C語言寫的源代碼。
Frama-C集成幾個分析技術到一個協作平臺中。其包含一組提供核心功能的內核(例如一個C程序的抽象化語法樹)和一組被稱爲插件的分析器。這些插件可以建立在平臺中其他插件的計算結果之上。
歸功於這個方法,Frama-C能提供一些複雜的工具,包括:
- 一個基於抽象解釋器的分析器,旨在驗證不存在運行時錯誤;
- 一個基於最弱前提運算的程序防護框架;
- 一個程序切片器;
- 一個驗證臨時特性的工具;
- 幾個代碼開發和相關性分析的工具。
這些插件共享常見的語言,可以通過ASCL(ANSI/ISO C Specification Language)特性交換信息,還可以通過它們的APIs集合信息。
- 最新版本:14.0
- 發佈日期:2016年11月1日
- 官網:http://frama-c.com/
- GitHub:https://github.com/Frama-C/Frama-C-snapshot
- 教程:http://frama-c.com/acsl_tutorial_index.html
Lint
Lint實用程序嘗試檢測命名爲C程序文件的功能,可能是錯誤,也可能是不可移植,或者是浪費。同時它也執行比C編譯器更嚴格的類型檢查。Lint實用程序運行C預處理器作爲它的第一階段,帶有這個預處理器的標誌“lint”,其被定義爲允許某些有問題的代碼被lint更改或跳過。因此,對於所有被lint檢查的代碼來說這個標誌應該被認爲是一個預留字。
Sparse
Sparse是一個源文件智能語法分析器:它不是編譯器(雖然它可以作爲一個前端編譯器使用),也不是預處理器(雖然它包含部分預處理語句)。
這意味着它是一個小而簡單的庫。內容太少是它容易使用的部分原因。它只有一個任務,就是爲任意用戶創造語法分析樹從而進行進一步的分析。它不是分詞器,也不是那些通用的上下文無關的語法分析器。事實上,上下文(語意)就是我想說的不僅解決分組標記,而且還有_type_在組中的含義。
語法分析完成以下5個階段:完整文件標記化、預處理(可以導致另一個文件進入標記階段)、語法分析、延長性評估、內聯函數擴展和簡化樹。
- 最新版本:0.5.0
- 發佈日期:2014年1月29日
- 官網:http://git.kernel.org/cgit/devel/sparse/sparse.git/
- Git:https://git-scm.com/
- GitHub:https://github.com/sparsecli/sparse
Splint
Splint是一個輔助註釋輕量級靜態檢查工具,檢查C程序的安全漏洞和代碼錯誤。作爲一個更好的lint,使用Splint毫不費力。如果投入額外的工作添加註釋到程序中,Splint可以執行比任何標準lint能完成的更強的檢查。
- 最新版本:3.1.2
- 發佈日期:2007年7月12日
- 官網:http://www.splint.org/
- GitHub:https://github.com/ravenexp/splint
4 Java
Checkstyle
Checkstyle是一個開發工具,可以幫助程序員編寫Java代碼,並使其遵守編碼標準。它自動執行檢查Java代碼的過程,使人們從這種無聊但是重要的任務中解放出來。對於那些想要執行代碼標準的項目,這是非常理想的。
Checkstyle是高配置的,幾乎可以支持任何代碼標準。
FindBugs
FindBugs是一個使用靜態分析尋找Java代碼中錯誤的程序。
- 最新版本:3.0.1
- 發佈日期:2015年3月6日
- 官網:http://findbugs.sourceforge.net/
- Sourceforge:https://sourceforge.net/projects/findbugs/
- GitHub:https://github.com/findbugsproject/findbugs
KeY
傳統的說,Key過去是一個Java程序驗證工具。雖然現在這仍然是它的主要應用之一,但是這些年來它已經成長爲一個擁有各種領域應用的程序驗證平臺。當前最重要的應用是:
- 程序驗證(獨立的圖形用戶界面、Eclipse集成、KeYHoare)
- 調試(符號執行調試器)
- 信息流分析(安全)
- 測試用例產生(KeYTestGen)
我們一直致力於讓Key框架更容易被其他程序訪問。例如,在另一個工具的後臺可以很容易的將Key當成一個符號執行引擎使用。正在進行的工作示例有Java編譯器的建造,是一個基於Key創建的符號執行樹。
Soot
最初,Soot開始於一個Java優化框架,到目前爲止,來自世界各地的研究人員和從業人員使用Soot分析、裝備、優化和可視化Java和Android應用。它提供四種中間格式分析和轉化Java字節碼:
- Baf:一個字節碼的簡化格式,操作簡單。
- Jimple:一個適合優化的3-地址類型中間格式。
- Shimple:Jimple的一個SSA變化格式。
- Grimp:一個適合反編譯和代碼檢查的Jimple合集版本。
5 JavaScript
JSHint
JSHint是一個社區驅動工具,它檢測JavaScript代碼中的錯誤和潛在問題。例如語法錯誤,隱性類型轉換錯誤,變量泄漏等等。值得注意的是,靜態代碼分析可以定位許多不同類型的錯誤,但是它不能檢測出你的程序是不是正確、快速或者有沒有內存泄漏。應該結合像JSHint這樣的工具和單元功能測試一起審查代碼。
JSHint非常靈活,使用者可以輕鬆的在期望的代碼執行環境中調整它。
- 最新版本:2.9.4
- 發佈日期:20016年10月20日
- 官網:http://jshint.com/
- GitHub:https://github.com/jshint/jshint
JSLint
JSLint本身是一個JavaScript程序,它可以尋找Javascript程序中的錯誤,是一個代碼質量工具。
JSLint掃描JavaScript源文件,尋找錯誤,並返回描述問題的信息和其在程序中的大概位置。這些問題不一定是語法錯誤,雖然經常是這樣。JSLint還查看一些風格習慣和結構問題。它不能證明你的代碼是正確的,只是提供另一雙眼睛去幫助發現問題。
JSLint定義了一個專業的JavaScript子集,一個比ECMAScrip程序語言標準(管理JavaScript的文件)更嚴格的語言。它會駁回大多數合法程序,是一個更高的標準。
6 Opa
Opa是一個用於網站開發的函數程序設計語言,編譯爲JavaScript。Opa包括兩部分:第一,是一個來自Opa語言的編譯器,功能類似JavaScript的語法但是有很多增強功能。第二,是一個JavaScript庫,在運行時使用。
Opa包括它自己的靜態分析器。作爲一種以網站應用開發爲目的的語言,強大的靜態類型編譯器檢查高級網站數據類型的有效性,默認阻止許多漏洞,比如XSS攻擊和數據庫代碼注入。
7 Packaging
Lintian
Lintian是一個靜態分析工具,用於尋找Debian基礎包中的錯誤、違反規則和其他的問題。它可以處理二進制Debian包(.deb)、微型/安裝程序包(.udeb)、Debian源程序包(.dsc)和(有限程度的)變更文件。
- 最新版本:2.5.50
- 發佈日期:2017年2月4日
- 官網:https://lintian.debian.org/
- GitHub:https://github.com/Debian/lintian
Rpmlint
Rpmlint是一個檢查Rpm包中常見錯誤的工具。經常被用在上傳之前測試單個軟件包和指定文件或者檢查整個分佈。默認情況下執行所有可用的檢查,但是專項檢查可以使用命令行參數實現。
被檢查的文件可以是一個Rpm軟件包文件、一個指定文件或一個目錄。如果是目錄,遞歸搜索Rpm和指定文件進行檢查。特殊值是指在標準輸入中被讀取的結果被當作單個指定文件內容處理。
- 最新版本:1.9
- 發佈日期:2016年6月29日
- 官網:https://linux.die.net/man/1/rpmlint
- RPM:http://rpm.org/index.html
- GitHub:https://github.com/rpm-software-management/rpmlint
8 Perl
Perl::Critic
Perl::Critic是一個可擴展的框架,對Perl源代碼創建和應用編碼標準。本質上,它是一個靜態源代碼分析引擎。Perl::Critic分佈着大量的Perl::Critic::Policy模塊,它們試圖執行各種編碼規則。大多數規則模塊以Damian Conway的書《Perl Best Practices》爲基礎。然而Perl::Critic不限於PBP這本書,甚至支持與Conway相矛盾的規則。你可以通過Perl::Critic接口啓用、禁用和自定義這些規則。你也可以創造適合自己的新規則模塊。
PerlTidy
Perltidy是一個Perl腳本,它縮進和重新格式化Perl腳本,使它們更容易閱讀。如果你編寫或者花很多時間讀Perl腳本,你可能覺得它是有幫助的。
格式化可以使用命令行參數控制。
Perltidy可以輸出置標語言和源代碼。
除了重新格式化腳本,Perltidy可以很好的幫助追蹤下面這些錯誤,缺少或多餘的括號、參數和方括號,因爲它非常擅長定位錯誤。
- 官網:http://perltidy.sourceforge.net/
- Sourceforge:https://sourceforge.net/projects/perltidy/
- GitHub:https://github.com/vifo/SublimePerlTidy
Padre
Padre是一個Perl集成開發環境,或換句話說是一個新手Perl程序員易於使用的文本編輯器,但是同時支持大型多語言和多技術項目。
我們的主要目的是創造一個無語倫比的環境來學習Perl,創建Perl腳本、模塊和分佈,提供一個可擴展的插件系統以支持添加相關功能和語言,同時支持高級開發者在任何地方使用這個編輯器。
它也提供靜態代碼分析來檢查常見的初級錯誤。
- 官網:http://padre.perlide.org/
- GitHub:https://github.com/PadreIDE/Padre
- Perl教程:https://perlmaven.com/perl-tutorial
9 Python
Pylint
Pylint是一個Python源代碼分析器,它可以查找編程錯誤,幫助推行編碼標準並嗅探代碼異味(在Martin Fowler的重構書中定義)。
Pylint有許多默認啓用的規則,因爲方法太多所以不能把它們全部壓制在一個最小程序中。它是高度可配置的,處理程序可以在代碼中控制它。另外,還可以寫一些插件添加自己的檢查。