本文是一個(gè)靜態(tài)代碼分析工具的清單凿傅,共有26個(gè)工具缠犀。包括4個(gè).NET工具、2個(gè)Ada工具聪舒、7個(gè)C++工具辨液、4個(gè)Java工具、2個(gè)JavaScript工具箱残、1個(gè)Opa工具滔迈、2個(gè)Packaging工具、3個(gè)Perl工具被辑、1個(gè)Python工具燎悍。
1.NET
.NET Compiler Platform(代號(hào) Roslyn)
Roslyn提供有著豐富的代碼分析API的開(kāi)源C#和Visual Basic編譯器。它可以使用這些Visual Studio里的API生成代碼分析工具盼理。
- 官網(wǎng):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提供一個(gè)快速的自動(dòng)的方法確保你的源代碼遵循預(yù)先定義的設(shè)計(jì)和風(fēng)格準(zhǔn)則间涵。它通過(guò)以下方式使靜態(tài)代碼分析進(jìn)入更高水平:即時(shí)代碼審查、及早發(fā)現(xiàn)問(wèn)題榜揖、編碼原則勾哩、自動(dòng)代碼審查、集成StyleCop檢查举哟、報(bào)告思劳。
FxCop
一個(gè)實(shí)現(xiàn).NET靜態(tài)代碼分析的圖形用戶接口和命令行工具。
FxCop提供幾百種規(guī)則實(shí)現(xiàn)各種類型的分析妨猩。包括:設(shè)計(jì)潜叛、全球化、互操作性壶硅、可維護(hù)性威兜、靈活性、命名庐椒、性能椒舵、可移植性、可靠性约谈、安全性笔宿,利用率。FxCop的功能完全集成到Visual Studio2010的高級(jí)版和最終版中棱诱。
- 最新版本:10.0
- 發(fā)布日期:2010年6月18日
- 官網(wǎng):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#源代碼泼橘,強(qiáng)制執(zhí)行一系列風(fēng)格和一致性規(guī)則÷跹可以在Visual Studio內(nèi)部運(yùn)行炬灭,也可以集成到MSBuild項(xiàng)目中。StyleCop還可以被集成到很多第三方開(kāi)發(fā)工具中靡菇。
核心原則:
StyleCop通過(guò)為C#代碼強(qiáng)制執(zhí)行一組通用風(fēng)格規(guī)則來(lái)體現(xiàn)價(jià)值重归。StyleCop將繼續(xù)利用一個(gè)連續(xù)的帶有允許的最小規(guī)則配置的規(guī)則集米愿。開(kāi)發(fā)者可以實(shí)現(xiàn)他們自己的規(guī)則,只要他們?cè)敢狻?/p>
StyleCop擁有和Visual Studio提前、MSBuild,TFS等無(wú)縫集成的能力泳唠。開(kāi)發(fā)者可以自由執(zhí)行自定義代碼狈网,將StyleCop集成到其他開(kāi)發(fā)和工具環(huán)境,如SDK文檔中所述笨腥。
- 最新版本:4.7.55
- 發(fā)布日期:2016年11月10日
- 官網(wǎng):http://stylecop.codeplex.com/
- GitHub:https://github.com/StyleCop
2 Ada
AdaControl
AdaControl是一個(gè)免費(fèi)的(授權(quán))工具拓哺,可以檢測(cè)Ada程序中使用的各種結(jié)構(gòu)。它的首要目標(biāo)是控制風(fēng)格和程序規(guī)則的正確使用脖母,但是它也可以作為一個(gè)強(qiáng)大的工具搜索編程風(fēng)格或設(shè)計(jì)模式的各種形式士鸥。搜索的元素范圍有非常簡(jiǎn)單的,比如某種實(shí)體谆级、聲明或語(yǔ)句的出現(xiàn)烤礁,也有非常復(fù)雜的,比如驗(yàn)證遵守了某種編程模式肥照。
- 最新版本:1.18r9
- 發(fā)布日期:2016年11月10日
- 官網(wǎng):http://www.adalog.fr/en/adacontrol.html
- Sourceforge:https://sourceforge.net/projects/adacontrol/
Fluctuat
Fluctuat是一抽象解釋器脚仔,以數(shù)字編程(C或Ada)靜態(tài)分析器為基礎(chǔ),由CEA-LIST的ME ASI(ModElling and Analysis of Systems in Interaction)實(shí)驗(yàn)室在2001年開(kāi)發(fā)舆绎。給出一組輸入和參數(shù)鲤脏,可能帶有不確定因素,它會(huì)考慮這個(gè)程序所有可能的行為吕朵,無(wú)論是真實(shí)的還是有限精度下猎醇,并描述這些不同的特性。
3 C努溃,C++
BLAST
BLAST(Berkeley Lazy Abstraction Software verification Tool伯克利惰性抽象軟件驗(yàn)證工具)是一個(gè)C語(yǔ)言靜態(tài)軟件驗(yàn)證工具硫嘶,它可以解決可達(dá)性問(wèn)題,例如是否可以通過(guò)一個(gè)有效的執(zhí)行命令從入口點(diǎn)(主程序)到達(dá)給定的程序位置梧税。
安全屬性的驗(yàn)證可能降低到可達(dá)性音半,BLAST常常用于核查L(zhǎng)inux驅(qū)動(dòng)程序驗(yàn)證項(xiàng)目。
可以在以下網(wǎng)站下載Linux系統(tǒng)的BLAST源代碼或二進(jìn)制版本贡蓖。
- 最新版本:2.7.2
- 發(fā)布日期:2014年2月17日
- 官網(wǎng):http://forge.ispras.ru/projects/blast/
- 文件:http://forge.ispras.ru/projects/blast/files
- 版本庫(kù):http://forge.ispras.ru/projects/blast/repository
Cpplint
這個(gè)項(xiàng)目繼續(xù)開(kāi)發(fā)cpplint曹鸠,它是一個(gè)C++風(fēng)格檢查器,遵循Google的C++風(fēng)格指南斥铺。提供的cpplint 為PYPI(Python Package Index)包彻桃,并添加了幾個(gè)功能和修復(fù)程序。它是google/styleguide的一個(gè)分支晾蜘,希望未來(lái)可以合并在一起邻眷。
- 最新版本:1.3.0
- 發(fā)布日期:2016年7月13日
- 官網(wǎng):https://pypi.python.org/pypi/cpplint
- GitHub:https://github.com/google/styleguide/tree/gh-pages/cpplint
Coccinelle
Coccinelle是一個(gè)程序匹配和轉(zhuǎn)換引擎眠屎。它提供語(yǔ)意修補(bǔ)程序以便在C代碼中指定期望的匹配和轉(zhuǎn)換。Coccinelle初始的目的是完成Linux的間接開(kāi)發(fā)肆饶。這種開(kāi)發(fā)包括客戶端代碼中所需要的改變改衩,目的是響應(yīng)庫(kù)應(yīng)用程序接口變化。還可能包括一些修改驯镊,例如重命名一個(gè)函數(shù)葫督、添加一個(gè)函數(shù)參數(shù),它的值以某種方式被上下文決定板惑、重組數(shù)據(jù)結(jié)構(gòu)橄镜。除了間接開(kāi)發(fā),Coccinelle還可以成功的尋找和修復(fù)系統(tǒng)代碼中的錯(cuò)誤冯乘。
- 最新版本:1.0.6
- 發(fā)布日期:2016年9月27日
- 官網(wǎng):http://coccinelle.lip6.fr/
- GitHub:https://github.com/coccinelle/coccinelle
Frama-C
Frama-C是一個(gè)平臺(tái)洽胶,致力于分析用C語(yǔ)言寫(xiě)的源代碼。
Frama-C集成幾個(gè)分析技術(shù)到一個(gè)協(xié)作平臺(tái)中裆馒。其包含一組提供核心功能的內(nèi)核(例如一個(gè)C程序的抽象化語(yǔ)法樹(shù))和一組被稱為插件的分析器姊氓。這些插件可以建立在平臺(tái)中其他插件的計(jì)算結(jié)果之上。
歸功于這個(gè)方法喷好,F(xiàn)rama-C能提供一些復(fù)雜的工具他膳,包括:
- 一個(gè)基于抽象解釋器的分析器,旨在驗(yàn)證不存在運(yùn)行時(shí)錯(cuò)誤绒窑;
- 一個(gè)基于最弱前提運(yùn)算的程序防護(hù)框架棕孙;
- 一個(gè)程序切片器;
- 一個(gè)驗(yàn)證臨時(shí)特性的工具些膨;
- 幾個(gè)代碼開(kāi)發(fā)和相關(guān)性分析的工具蟀俊。
這些插件共享常見(jiàn)的語(yǔ)言,可以通過(guò)ASCL(ANSI/ISO C Specification Language)特性交換信息订雾,還可以通過(guò)它們的APIs集合信息肢预。
- 最新版本:14.0
- 發(fā)布日期:2016年11月1日
- 官網(wǎng):http://frama-c.com/
- GitHub:https://github.com/Frama-C/Frama-C-snapshot
- 教程:http://frama-c.com/acsl_tutorial_index.html
Lint
Lint實(shí)用程序嘗試檢測(cè)命名為C程序文件的功能,可能是錯(cuò)誤洼哎,也可能是不可移植烫映,或者是浪費(fèi)。同時(shí)它也執(zhí)行比C編譯器更嚴(yán)格的類型檢查噩峦。Lint實(shí)用程序運(yùn)行C預(yù)處理器作為它的第一階段锭沟,帶有這個(gè)預(yù)處理器的標(biāo)志“l(fā)int”,其被定義為允許某些有問(wèn)題的代碼被lint更改或跳過(guò)识补。因此族淮,對(duì)于所有被lint檢查的代碼來(lái)說(shuō)這個(gè)標(biāo)志應(yīng)該被認(rèn)為是一個(gè)預(yù)留字。
Sparse
Sparse是一個(gè)源文件智能語(yǔ)法分析器:它不是編譯器(雖然它可以作為一個(gè)前端編譯器使用),也不是預(yù)處理器(雖然它包含部分預(yù)處理語(yǔ)句)祝辣。
這意味著它是一個(gè)小而簡(jiǎn)單的庫(kù)贴妻。內(nèi)容太少是它容易使用的部分原因。它只有一個(gè)任務(wù)蝙斜,就是為任意用戶創(chuàng)造語(yǔ)法分析樹(shù)從而進(jìn)行進(jìn)一步的分析名惩。它不是分詞器,也不是那些通用的上下文無(wú)關(guān)的語(yǔ)法分析器孕荠。事實(shí)上娩鹉,上下文(語(yǔ)意)就是我想說(shuō)的不僅解決分組標(biāo)記,而且還有type在組中的含義岛琼。
語(yǔ)法分析完成以下5個(gè)階段:完整文件標(biāo)記化底循、預(yù)處理(可以導(dǎo)致另一個(gè)文件進(jìn)入標(biāo)記階段)巢株、語(yǔ)法分析槐瑞、延長(zhǎng)性評(píng)估、內(nèi)聯(lián)函數(shù)擴(kuò)展和簡(jiǎn)化樹(shù)阁苞。
- 最新版本:0.5.0
- 發(fā)布日期:2014年1月29日
- 官網(wǎng):http://git.kernel.org/cgit/devel/sparse/sparse.git/
- Git:https://git-scm.com/
- GitHub:https://github.com/sparsecli/sparse
Splint
Splint是一個(gè)輔助注釋輕量級(jí)靜態(tài)檢查工具困檩,檢查C程序的安全漏洞和代碼錯(cuò)誤。作為一個(gè)更好的lint那槽,使用Splint毫不費(fèi)力悼沿。如果投入額外的工作添加注釋到程序中,Splint可以執(zhí)行比任何標(biāo)準(zhǔn)lint能完成的更強(qiáng)的檢查骚灸。
- 最新版本:3.1.2
- 發(fā)布日期:2007年7月12日
- 官網(wǎng):http://www.splint.org/
- GitHub:https://github.com/ravenexp/splint
4 Java
Checkstyle
Checkstyle是一個(gè)開(kāi)發(fā)工具糟趾,可以幫助程序員編寫(xiě)Java代碼,并使其遵守編碼標(biāo)準(zhǔn)甚牲。它自動(dòng)執(zhí)行檢查Java代碼的過(guò)程义郑,使人們從這種無(wú)聊但是重要的任務(wù)中解放出來(lái)。對(duì)于那些想要執(zhí)行代碼標(biāo)準(zhǔn)的項(xiàng)目丈钙,這是非常理想的非驮。
Checkstyle是高配置的,幾乎可以支持任何代碼標(biāo)準(zhǔn)雏赦。
FindBugs
FindBugs是一個(gè)使用靜態(tài)分析尋找Java代碼中錯(cuò)誤的程序劫笙。
- 最新版本:3.0.1
- 發(fā)布日期:2015年3月6日
- 官網(wǎng):http://findbugs.sourceforge.net/
- Sourceforge:https://sourceforge.net/projects/findbugs/
- GitHub:https://github.com/findbugsproject/findbugs
KeY
傳統(tǒng)的說(shuō),Key過(guò)去是一個(gè)Java程序驗(yàn)證工具星岗。雖然現(xiàn)在這仍然是它的主要應(yīng)用之一填大,但是這些年來(lái)它已經(jīng)成長(zhǎng)為一個(gè)擁有各種領(lǐng)域應(yīng)用的程序驗(yàn)證平臺(tái)。當(dāng)前最重要的應(yīng)用是:
- 程序驗(yàn)證(獨(dú)立的圖形用戶界面俏橘、Eclipse集成栋盹、KeYHoare)
- 調(diào)試(符號(hào)執(zhí)行調(diào)試器)
- 信息流分析(安全)
- 測(cè)試用例產(chǎn)生(KeYTestGen)
我們一直致力于讓Key框架更容易被其他程序訪問(wèn)。例如,在另一個(gè)工具的后臺(tái)可以很容易的將Key當(dāng)成一個(gè)符號(hào)執(zhí)行引擎使用例获。正在進(jìn)行的工作示例有Java編譯器的建造汉额,是一個(gè)基于Key創(chuàng)建的符號(hào)執(zhí)行樹(shù)。
- 官網(wǎng):http://www.key-project.org/index.php
- Key book:http://www.key-project.org/thebook2/
Soot
最初榨汤,Soot開(kāi)始于一個(gè)Java優(yōu)化框架蠕搜,到目前為止,來(lái)自世界各地的研究人員和從業(yè)人員使用Soot分析收壕、裝備妓灌、優(yōu)化和可視化Java和Android應(yīng)用。它提供四種中間格式分析和轉(zhuǎn)化Java字節(jié)碼:
- Baf:一個(gè)字節(jié)碼的簡(jiǎn)化格式蜜宪,操作簡(jiǎn)單虫埂。
- Jimple:一個(gè)適合優(yōu)化的3-地址類型中間格式。
- Shimple:Jimple的一個(gè)SSA變化格式圃验。
- Grimp:一個(gè)適合反編譯和代碼檢查的Jimple合集版本掉伏。
- 官網(wǎng):https://sable.github.io/soot/
- GitHub:https://github.com/Sable/soot
5 JavaScript
JSHint
JSHint是一個(gè)社區(qū)驅(qū)動(dòng)工具,它檢測(cè)JavaScript代碼中的錯(cuò)誤和潛在問(wèn)題澳窑。例如語(yǔ)法錯(cuò)誤斧散,隱性類型轉(zhuǎn)換錯(cuò)誤,變量泄漏等等摊聋。值得注意的是鸡捐,靜態(tài)代碼分析可以定位許多不同類型的錯(cuò)誤,但是它不能檢測(cè)出你的程序是不是正確麻裁、快速或者有沒(méi)有內(nèi)存泄漏箍镜。應(yīng)該結(jié)合像JSHint這樣的工具和單元功能測(cè)試一起審查代碼。
JSHint非常靈活煎源,使用者可以輕松的在期望的代碼執(zhí)行環(huán)境中調(diào)整它色迂。
- 最新版本:2.9.4
- 發(fā)布日期:20016年10月20日
- 官網(wǎng):http://jshint.com/
- GitHub:https://github.com/jshint/jshint
JSLint
JSLint本身是一個(gè)JavaScript程序,它可以尋找Javascript程序中的錯(cuò)誤薪夕,是一個(gè)代碼質(zhì)量工具脚草。
JSLint掃描JavaScript源文件,尋找錯(cuò)誤原献,并返回描述問(wèn)題的信息和其在程序中的大概位置馏慨。這些問(wèn)題不一定是語(yǔ)法錯(cuò)誤,雖然經(jīng)常是這樣姑隅。JSLint還查看一些風(fēng)格習(xí)慣和結(jié)構(gòu)問(wèn)題写隶。它不能證明你的代碼是正確的,只是提供另一雙眼睛去幫助發(fā)現(xiàn)問(wèn)題讲仰。
JSLint定義了一個(gè)專業(yè)的JavaScript子集慕趴,一個(gè)比ECMAScrip程序語(yǔ)言標(biāo)準(zhǔn)(管理JavaScript的文件)更嚴(yán)格的語(yǔ)言。它會(huì)駁回大多數(shù)合法程序,是一個(gè)更高的標(biāo)準(zhǔn)冕房。
- 官網(wǎng):http://jslint.com/
- GitHub:https://github.com/douglascrockford/JSLint
6 Opa
Opa是一個(gè)用于網(wǎng)站開(kāi)發(fā)的函數(shù)程序設(shè)計(jì)語(yǔ)言躏啰,編譯為JavaScript。Opa包括兩部分:第一耙册,是一個(gè)來(lái)自O(shè)pa語(yǔ)言的編譯器给僵,功能類似JavaScript的語(yǔ)法但是有很多增強(qiáng)功能。第二详拙,是一個(gè)JavaScript庫(kù)帝际,在運(yùn)行時(shí)使用。
Opa包括它自己的靜態(tài)分析器饶辙。作為一種以網(wǎng)站應(yīng)用開(kāi)發(fā)為目的的語(yǔ)言蹲诀,強(qiáng)大的靜態(tài)類型編譯器檢查高級(jí)網(wǎng)站數(shù)據(jù)類型的有效性,默認(rèn)阻止許多漏洞弃揽,比如XSS攻擊和數(shù)據(jù)庫(kù)代碼注入脯爪。
- 官網(wǎng):http://opalang.org/
- GitHub:https://github.com/MLstate/opalang
7 Packaging
Lintian
Lintian是一個(gè)靜態(tài)分析工具,用于尋找Debian基礎(chǔ)包中的錯(cuò)誤蹋宦、違反規(guī)則和其他的問(wèn)題披粟。它可以處理二進(jìn)制Debian包(.deb)咒锻、微型/安裝程序包(.udeb)冷冗、Debian源程序包(.dsc)和(有限程度的)變更文件。
- 最新版本:2.5.50
- 發(fā)布日期:2017年2月4日
- 官網(wǎng):https://lintian.debian.org/
- GitHub:https://github.com/Debian/lintian
Rpmlint
Rpmlint是一個(gè)檢查Rpm包中常見(jiàn)錯(cuò)誤的工具惑艇。經(jīng)常被用在上傳之前測(cè)試單個(gè)軟件包和指定文件或者檢查整個(gè)分布蒿辙。默認(rèn)情況下執(zhí)行所有可用的檢查,但是專項(xiàng)檢查可以使用命令行參數(shù)實(shí)現(xiàn)滨巴。
被檢查的文件可以是一個(gè)Rpm軟件包文件思灌、一個(gè)指定文件或一個(gè)目錄。如果是目錄恭取,遞歸搜索Rpm和指定文件進(jìn)行檢查泰偿。特殊值是指在標(biāo)準(zhǔn)輸入中被讀取的結(jié)果被當(dāng)作單個(gè)指定文件內(nèi)容處理。
- 最新版本:1.9
- 發(fā)布日期:2016年6月29日
- 官網(wǎng):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是一個(gè)可擴(kuò)展的框架蜈垮,對(duì)Perl源代碼創(chuàng)建和應(yīng)用編碼標(biāo)準(zhǔn)耗跛。本質(zhì)上,它是一個(gè)靜態(tài)源代碼分析引擎攒发。Perl::Critic分布著大量的Perl::Critic::Policy模塊调塌,它們?cè)噲D執(zhí)行各種編碼規(guī)則。大多數(shù)規(guī)則模塊以Damian Conway的書(shū)《Perl Best Practices》為基礎(chǔ)惠猿。然而Perl::Critic不限于PBP這本書(shū)羔砾,甚至支持與Conway相矛盾的規(guī)則。你可以通過(guò)Perl::Critic接口啟用、禁用和自定義這些規(guī)則姜凄。你也可以創(chuàng)造適合自己的新規(guī)則模塊政溃。
- 官網(wǎng):http://perlcritic.com/
- GitHub:https://github.com/Perl-Critic/Perl-Critic
PerlTidy
Perltidy是一個(gè)Perl腳本,它縮進(jìn)和重新格式化Perl腳本态秧,使它們更容易閱讀玩祟。如果你編寫(xiě)或者花很多時(shí)間讀Perl腳本,你可能覺(jué)得它是有幫助的屿聋。
格式化可以使用命令行參數(shù)控制空扎。
Perltidy可以輸出置標(biāo)語(yǔ)言和源代碼。
除了重新格式化腳本润讥,Perltidy可以很好的幫助追蹤下面這些錯(cuò)誤转锈,缺少或多余的括號(hào)、參數(shù)和方括號(hào)楚殿,因?yàn)樗浅I瞄L(zhǎng)定位錯(cuò)誤撮慨。
- 官網(wǎng):http://perltidy.sourceforge.net/
- Sourceforge:https://sourceforge.net/projects/perltidy/
- GitHub:https://github.com/vifo/SublimePerlTidy
Padre
Padre是一個(gè)Perl集成開(kāi)發(fā)環(huán)境,或換句話說(shuō)是一個(gè)新手Perl程序員易于使用的文本編輯器脆粥,但是同時(shí)支持大型多語(yǔ)言和多技術(shù)項(xiàng)目砌溺。
我們的主要目的是創(chuàng)造一個(gè)無(wú)語(yǔ)倫比的環(huán)境來(lái)學(xué)習(xí)Perl,創(chuàng)建Perl腳本变隔、模塊和分布规伐,提供一個(gè)可擴(kuò)展的插件系統(tǒng)以支持添加相關(guān)功能和語(yǔ)言,同時(shí)支持高級(jí)開(kāi)發(fā)者在任何地方使用這個(gè)編輯器匣缘。
它也提供靜態(tài)代碼分析來(lái)檢查常見(jiàn)的初級(jí)錯(cuò)誤猖闪。
- 官網(wǎng):http://padre.perlide.org/
- GitHub:https://github.com/PadreIDE/Padre
- Perl教程:https://perlmaven.com/perl-tutorial
9 Python
Pylint
Pylint是一個(gè)Python源代碼分析器,它可以查找編程錯(cuò)誤肌厨,幫助推行編碼標(biāo)準(zhǔn)并嗅探代碼異味(在Martin Fowler的重構(gòu)書(shū)中定義)培慌。
Pylint有許多默認(rèn)啟用的規(guī)則,因?yàn)榉椒ㄌ嗨圆荒馨阉鼈內(nèi)繅褐圃谝粋€(gè)最小程序中柑爸。它是高度可配置的吵护,處理程序可以在代碼中控制它。另外表鳍,還可以寫(xiě)一些插件添加自己的檢查馅而。
- 官網(wǎng):https://www.pylint.org/
- GitHub:https://github.com/PyCQA/pylint