1. 程式人生 > >靜態程式碼分析工具列表分析---程式碼分析工具列表(30款工具)

靜態程式碼分析工具列表分析---程式碼分析工具列表(30款工具)

本文是一個靜態程式碼分析工具的清單,共有30個工具。包括4個.NET工具、2個Ada工具、7個C++工具、4個Java工具、2個JavaScript工具、1個Opa工具、2個Packaging工具、3個Perl工具、1個Python工具、1個嵌入式工具、2個二進位制工具、1個靜態分析工具

Fortify SCA

       Fortify SCA 是一個靜態的、白盒的軟體原始碼安全測試工具。它通過內建的五大主要分析引擎:資料流、語義、結構、控制流、配置流等對應用軟體的原始碼進行靜態的分析,分析的過程中與它特有的軟體安全漏洞規則集進行全面地匹配、查詢,從而將原始碼中存在的安全漏洞掃描出來,並給予整理報告。掃描的結果中不但包括詳細的安全漏洞的資訊,還會有相關的安全知識的說明,以及修復意見的提供


  • Coverity原始碼缺陷檢測工具

       Coverity能夠準確識別出研發工作流中的嚴重質量缺陷,並且提供可行的修正建議來降低軟體錯誤和安全漏洞的修復成本、時間和風險。Coverity可使用高階原始碼分析技術在非常複雜的C、C++、Java、Objective-C、Javascript及C#碼庫中發現最嚴重的質量缺陷和安全漏洞, Coverity是第一個能夠快速、準確分析當今的大規模(幾百萬、甚至幾千萬行的程式碼)、高複雜度程式碼的工具,Coverity解決了影響原始碼分析有效性的很多關鍵問題:構建整合、編譯相容性、高誤報率、有效的錯誤根源分析等。

 官網:https://coverity.com

ProteCode二級制程式碼掃描工具

  ProteCode可對應用程式和韌體進行掃描,並列出所含程式碼和庫檔案相關的軟體許可及對應的已知漏洞。ProteCode不僅能揭示開源的和私有的第三方程式碼和庫檔案,還能夠枚舉出對應的CVE(Common Vulnerabilities and Exposures)識別符號以及相關的軟體許可證。將編譯好的二進位制檔案上傳(不需要原始碼),僅需花費幾分鐘時間就可以揭示出你所需要的軟體內部執行的資訊。解決方案有助於研發團隊安全無誤地使用和管控第三方程式碼。在開發和測試流程或法律合規部門管理由於使用第三方程式碼所產生的風險,其中包括開源、內部開發、外包和商業程式碼。


Hex-Rays二進位制分析工具

­­ 荷蘭Hex-Rays公司的二進位制分析工具能夠將二進位制程式碼轉換成分析員們容易可以讀取和修改的文字,幫助分析員分析和驗證的程式,更快捷的判斷軟體的有用性和可用性,定位安全問題。

.NET

.NET Compiler Platform(代號 Roslyn)

Roslyn提供有著豐富的程式碼分析API的開源C#和Visual Basic編譯器。它可以使用這些Visual Studio裡的API生成程式碼分析工具。

CodeIt.Right

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

FxCop

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

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

StyleCop

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

核心原則:

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

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

 Ada

AdaControl

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

Fluctuat

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

 C,C++

BLAST

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

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

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

Cpplint

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

Coccinelle

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

Frama-C

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

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

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

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

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

Lint

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

Sparse

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

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

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

Splint

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

 Java

Checkstyle

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

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

FindBugs

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

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合集版本。

 JavaScript

JSHint

JSHint是一個社群驅動工具,它檢測JavaScript程式碼中的錯誤和潛在問題。例如語法錯誤,隱性型別轉換錯誤,變數洩漏等等。值得注意的是,靜態程式碼分析可以定位許多不同型別的錯誤,但是它不能檢測出你的程式是不是正確、快速或者有沒有記憶體洩漏。應該結合像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)和(有限程度的)變更檔案。

Rpmlint

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

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

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可以很好的幫助追蹤下面這些錯誤,缺少或多餘的括號、引數和方括號,因為它非常擅長定位錯誤。

Padre

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

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

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

Python

Pylint

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

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