1. 程式人生 > >靜態程式碼分析工具清單:開源篇(各語言)

靜態程式碼分析工具清單:開源篇(各語言)

本文是一個靜態程式碼分析工具的清單,共有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生成程式碼分析工具。

Roslyn

CodeIt.Right

CodeIt.Right提供一個快速的自動的方法確保你的原始碼遵循預先定義的設計和風格準則。它通過以下方式使靜態程式碼分析進入更高水平:即時程式碼審查、及早發現問題、編碼原則、自動程式碼審查、整合StyleCop檢查、報告。

CodeIt.Right

FxCop

一個實現.NET靜態程式碼分析的圖形使用者介面和命令列工具。

FxCop提供幾百種規則實現各種型別的分析。包括:設計、全球化、互操作性、可維護性、靈活性、命名、效能、可移植性、可靠性、安全性,利用率。FxCop的功能完全整合到Visual Studio2010的高階版和最終版中。

FxCop

StyleCop

StyleCop分析C#原始碼,強制執行一系列風格和一致性規則。可以在Visual Studio內部執行,也可以整合到MSBuild專案中。StyleCop還可以被整合到很多第三方開發工具中。

核心原則:

StyleCop通過為C#程式碼強制執行一組通用風格規則來體現價值。StyleCop將繼續利用一個連續的帶有允許的最小規則配置的規則集。開發者可以實現他們自己的規則,只要他們願意。

StyleCop擁有和Visual Studio、MSBuild,TFS等無縫整合的能力。開發者可以自由執行自定義程式碼,將StyleCop整合到其他開發和工具環境,如SDK文件中所述。

StyleCop

2 Ada

AdaControl

AdaControl是一個免費的(授權)工具,可以檢測Ada程式中使用的各種結構。它的首要目標是控制風格和程式規則的正確使用,但是它也可以作為一個強大的工具搜尋程式設計風格或設計模式的各種形式。搜尋的元素範圍有非常簡單的,比如某種實體、宣告或語句的出現,也有非常複雜的,比如驗證遵守了某種程式設計模式。

AdaControl

Fluctuat

Fluctuat是一抽象直譯器,以數字程式設計(C或Ada)靜態分析器為基礎,由CEA-LIST的ME ASI(ModElling and Analysis of Systems in Interaction)實驗室在2001年開發。給出一組輸入和引數,可能帶有不確定因素,它會考慮這個程式所有可能的行為,無論是真實的還是有限精度下,並描述這些不同的特性。

Fluctuat

3 C,C++

BLAST

BLAST(Berkeley Lazy Abstraction Software verification Tool伯克利惰性抽象軟體驗證工具)是一個C語言靜態軟體驗證工具,它可以解決可達性問題,例如是否可以通過一個有效的執行命令從入口點(主程式)到達給定的程式位置。

安全屬性的驗證可能降低到可達性,BLAST常常用於核查Linux驅動程式驗證專案。

可以在以下網站下載Linux系統的BLAST原始碼或二進位制版本。

BLAST

Cpplint

這個專案繼續開發cpplint,它是一個C++風格檢查器,遵循Google的C++風格指南。提供的cpplint 為PYPI(Python Package Index)包,並添加了幾個功能和修復程式。它是google/styleguide的一個分支,希望未來可以合併在一起。

Cpplint

Coccinelle

Coccinelle是一個程式匹配和轉換引擎。它提供語意修補程式以便在C程式碼中指定期望的匹配和轉換。Coccinelle初始的目的是完成Linux的間接開發。這種開發包括客戶端程式碼中所需要的改變,目的是響應庫應用程式介面變化。還可能包括一些修改,例如重新命名一個函式、新增一個函式引數,它的值以某種方式被上下文決定、重組資料結構。除了間接開發,Coccinelle還可以成功的尋找和修復系統程式碼中的錯誤。

Coccinelle

Frama-C

Frama-C是一個平臺,致力於分析用C語言寫的原始碼。

Frama-C整合幾個分析技術到一個協作平臺中。其包含一組提供核心功能的核心(例如一個C程式的抽象化語法樹)和一組被稱為外掛的分析器。這些外掛可以建立在平臺中其他外掛的計算結果之上。

歸功於這個方法,Frama-C能提供一些複雜的工具,包括:

  • 一個基於抽象直譯器的分析器,旨在驗證不存在執行時錯誤;
  • 一個基於最弱前提運算的程式防護框架;
  • 一個程式切片器;
  • 一個驗證臨時特性的工具;
  • 幾個程式碼開發和相關性分析的工具。

這些外掛共享常見的語言,可以通過ASCL(ANSI/ISO C Specification Language)特性交換資訊,還可以通過它們的APIs集合資訊。

Frama-C

Lint

Lint實用程式嘗試檢測命名為C程式檔案的功能,可能是錯誤,也可能是不可移植,或者是浪費。同時它也執行比C編譯器更嚴格的型別檢查。Lint實用程式執行C前處理器作為它的第一階段,帶有這個前處理器的標誌“lint”,其被定義為允許某些有問題的程式碼被lint更改或跳過。因此,對於所有被lint檢查的程式碼來說這個標誌應該被認為是一個預留字。

Lint

Sparse

Sparse是一個原始檔智慧語法分析器:它不是編譯器(雖然它可以作為一個前端編譯器使用),也不是前處理器(雖然它包含部分預處理語句)。

這意味著它是一個小而簡單的庫。內容太少是它容易使用的部分原因。它只有一個任務,就是為任意使用者創造語法分析樹從而進行進一步的分析。它不是分詞器,也不是那些通用的上下文無關的語法分析器。事實上,上下文(語意)就是我想說的不僅解決分組標記,而且還有_type_在組中的含義。

語法分析完成以下5個階段:完整檔案標記化、預處理(可以導致另一個檔案進入標記階段)、語法分析、延長性評估、行內函數擴充套件和簡化樹。

Sparse

Splint

Splint是一個輔助註釋輕量級靜態檢查工具,檢查C程式的安全漏洞和程式碼錯誤。作為一個更好的lint,使用Splint毫不費力。如果投入額外的工作添加註釋到程式中,Splint可以執行比任何標準lint能完成的更強的檢查。

Splint

4 Java

Checkstyle

Checkstyle是一個開發工具,可以幫助程式設計師編寫Java程式碼,並使其遵守編碼標準。它自動執行檢查Java程式碼的過程,使人們從這種無聊但是重要的任務中解放出來。對於那些想要執行程式碼標準的專案,這是非常理想的。

Checkstyle是高配置的,幾乎可以支援任何程式碼標準。

checkstype

FindBugs

FindBugs是一個使用靜態分析尋找Java程式碼中錯誤的程式。

findbugs

KeY

傳統的說,Key過去是一個Java程式驗證工具。雖然現在這仍然是它的主要應用之一,但是這些年來它已經成長為一個擁有各種領域應用的程式驗證平臺。當前最重要的應用是:

  • 程式驗證(獨立的圖形使用者介面、Eclipse整合、KeYHoare)
  • 除錯(符號執行偵錯程式)
  • 資訊流分析(安全)
  • 測試用例產生(KeYTestGen)

我們一直致力於讓Key框架更容易被其他程式訪問。例如,在另一個工具的後臺可以很容易的將Key當成一個符號執行引擎使用。正在進行的工作示例有Java編譯器的建造,是一個基於Key建立的符號執行樹。

Key

Soot

最初,Soot開始於一個Java優化框架,到目前為止,來自世界各地的研究人員和從業人員使用Soot分析、裝備、優化和視覺化Java和Android應用。它提供四種中間格式分析和轉化Java位元組碼:

  • Baf:一個位元組碼的簡化格式,操作簡單。
  • Jimple:一個適合優化的3-地址型別中間格式。
  • Shimple:Jimple的一個SSA變化格式。
  • Grimp:一個適合反編譯和程式碼檢查的Jimple合集版本。

Soot

5 JavaScript

JSHint

JSHint是一個社群驅動工具,它檢測JavaScript程式碼中的錯誤和潛在問題。例如語法錯誤,隱性型別轉換錯誤,變數洩漏等等。值得注意的是,靜態程式碼分析可以定位許多不同型別的錯誤,但是它不能檢測出你的程式是不是正確、快速或者有沒有記憶體洩漏。應該結合像JSHint這樣的工具和單元功能測試一起審查程式碼。

JSHint非常靈活,使用者可以輕鬆的在期望的程式碼執行環境中調整它。

JSHint

JSLint

JSLint本身是一個JavaScript程式,它可以尋找Javascript程式中的錯誤,是一個程式碼質量工具。

JSLint掃描JavaScript原始檔,尋找錯誤,並返回描述問題的資訊和其在程式中的大概位置。這些問題不一定是語法錯誤,雖然經常是這樣。JSLint還檢視一些風格習慣和結構問題。它不能證明你的程式碼是正確的,只是提供另一雙眼睛去幫助發現問題。

JSLint定義了一個專業的JavaScript子集,一個比ECMAScrip程式語言標準(管理JavaScript的檔案)更嚴格的語言。它會駁回大多數合法程式,是一個更高的標準。

JSLint

6 Opa

Opa是一個用於網站開發的函式程式設計語言,編譯為JavaScript。Opa包括兩部分:第一,是一個來自Opa語言的編譯器,功能類似JavaScript的語法但是有很多增強功能。第二,是一個JavaScript庫,在執行時使用。

Opa包括它自己的靜態分析器。作為一種以網站應用開發為目的的語言,強大的靜態型別編譯器檢查高階網站資料型別的有效性,預設阻止許多漏洞,比如XSS攻擊和資料庫程式碼注入。

Opa

7 Packaging

Lintian

Lintian是一個靜態分析工具,用於尋找Debian基礎包中的錯誤、違反規則和其他的問題。它可以處理二進位制Debian包(.deb)、微型/安裝程式包(.udeb)、Debian源程式包(.dsc)和(有限程度的)變更檔案。

Lintian

Rpmlint

Rpmlint是一個檢查Rpm包中常見錯誤的工具。經常被用在上傳之前測試單個軟體包和指定檔案或者檢查整個分佈。預設情況下執行所有可用的檢查,但是專項檢查可以使用命令列引數實現。

被檢查的檔案可以是一個Rpm軟體包檔案、一個指定檔案或一個目錄。如果是目錄,遞迴搜尋Rpm和指定檔案進行檢查。特殊值是指在標準輸入中被讀取的結果被當作單個指定檔案內容處理。

Rpmlint

8 Perl

Perl::Critic

Perl::Critic是一個可擴充套件的框架,對Perl原始碼建立和應用編碼標準。本質上,它是一個靜態原始碼分析引擎。Perl::Critic分佈著大量的Perl::Critic::Policy模組,它們試圖執行各種編碼規則。大多數規則模組以Damian Conway的書《Perl Best Practices》為基礎。然而Perl::Critic不限於PBP這本書,甚至支援與Conway相矛盾的規則。你可以通過Perl::Critic介面啟用、禁用和自定義這些規則。你也可以創造適合自己的新規則模組。

PerlCritic

PerlTidy

Perltidy是一個Perl指令碼,它縮排和重新格式化Perl指令碼,使它們更容易閱讀。如果你編寫或者花很多時間讀Perl指令碼,你可能覺得它是有幫助的。

格式化可以使用命令列引數控制。

Perltidy可以輸出置標語言和原始碼。

除了重新格式化指令碼,Perltidy可以很好的幫助追蹤下面這些錯誤,缺少或多餘的括號、引數和方括號,因為它非常擅長定位錯誤。

Perltidy

Padre

Padre是一個Perl整合開發環境,或換句話說是一個新手Perl程式設計師易於使用的文字編輯器,但是同時支援大型多語言和多技術專案。

我們的主要目的是創造一個無語倫比的環境來學習Perl,建立Perl指令碼、模組和分佈,提供一個可擴充套件的外掛系統以支援新增相關功能和語言,同時支援高階開發者在任何地方使用這個編輯器。

它也提供靜態程式碼分析來檢查常見的初級錯誤。

Padre

9 Python

Pylint

Pylint是一個Python原始碼分析器,它可以查詢程式設計錯誤,幫助推行編碼標準並嗅探程式碼異味(在Martin Fowler的重構書中定義)。

Pylint有許多預設啟用的規則,因為方法太多所以不能把它們全部壓制在一個最小程式中。它是高度可配置的,處理程式可以在程式碼中控制它。另外,還可以寫一些外掛新增自己的檢查。

Pylint