本文是一個靜态代碼分析工具的清單,共有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檢查、報告。
- 官網:https://marketplace.visualstudio.com/items?itemName=sergeb.CodeItRight
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年開發。給出一組輸入和參數,可能帶有不确定因素,它會考慮這個程式所有可能的行為,無論是真實的還是有限精度下,并描述這些不同的特性。
- 官網:http://www.lix.polytechnique.fr/Labo/Sylvie.Putot/fluctuat.html
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檢查的代碼來說這個标志應該被認為是一個預留字。
- 官網:http://www.unix.com/man-page/FreeBSD/1/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是高配置的,幾乎可以支援任何代碼标準。
- 官網:http://checkstyle.sourceforge.net/
- GitHub:https://github.com/checkstyle/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建立的符号執行樹。
- 官網:http://www.key-project.org/index.php
- Key book:http://www.key-project.org/thebook2/
Soot
最初,Soot開始于一個Java優化架構,到目前為止,來自世界各地的研究人員和從業人員使用Soot分析、裝備、優化和可視化Java和Android應用。它提供四種中間格式分析和轉化Java位元組碼:
- Baf:一個位元組碼的簡化格式,操作簡單。
- Jimple:一個适合優化的3-位址類型中間格式。
- Shimple:Jimple的一個SSA變化格式。
- Grimp:一個适合反編譯和代碼檢查的Jimple合集版本。
- 官網:https://sable.github.io/soot/
- GitHub:https://github.com/Sable/soot
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的檔案)更嚴格的語言。它會駁回大多數合法程式,是一個更高的标準。
- 官網:http://jslint.com/
- GitHub:https://github.com/douglascrockford/JSLint
6 Opa
Opa是一個用于網站開發的函數程式設計語言,編譯為JavaScript。Opa包括兩部分:第一,是一個來自Opa語言的編譯器,功能類似JavaScript的文法但是有很多增強功能。第二,是一個JavaScript庫,在運作時使用。
Opa包括它自己的靜态分析器。作為一種以網站應用開發為目的的語言,強大的靜态類型編譯器檢查進階網站資料類型的有效性,預設阻止許多漏洞,比如XSS攻擊和資料庫代碼注入。
- 官網:http://opalang.org/
- GitHub:https://github.com/MLstate/opalang
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接口啟用、禁用和自定義這些規則。你也可以創造适合自己的新規則子產品。
- 官網:http://perlcritic.com/
- GitHub:https://github.com/Perl-Critic/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有許多預設啟用的規則,因為方法太多是以不能把它們全部壓制在一個最小程式中。它是高度可配置的,處理程式可以在代碼中控制它。另外,還可以寫一些插件添加自己的檢查。
- 官網:https://www.pylint.org/
- GitHub:https://github.com/PyCQA/pylint