1. 程式人生 > >Coverity程式碼靜態檢測工具介紹

Coverity程式碼靜態檢測工具介紹

使用了Coverity程式碼靜態檢測工具。功能很強大,超乎我的期望。主要功能如下:

  1. 列出不會被執行到的程式碼
  2. 列出沒被初始化的類成員變數
  3. 列出沒有被捕獲的異常
  4. 列出沒有給出返回值的return語句
  5. 某個函式雖然有返回值,但呼叫該函式的地方沒有用到它的返回值,這也會被列出來
  6. 列出沒有被回收的new出來的物件
  7. 列出沒有被關閉的控制代碼
  8. 精確定位到程式碼行,並提供逐層展開函式的功能
  9. 列出可能的數值型別溢位。例如,無符號int數做 ++ 操作,可能導致int溢位,都會被檢測到。
  10. 什麼地方該用&位運算,而不應該用|位運算,都能定位出來並作出建議
  11. ostream在一個函式中被修改了格式,但退出該函式之後沒有將ostream恢復成先前的格式,也會被檢測到
  12. ……

貌似程式中的所有可能分支,所有new出來的物件何時被銷燬,所有可能的異常是否被程式碼捕獲,它都能掃描到。真不簡單啊。

我用到的Coverity是部署在企業內部的,通過https頁面的方式向程式設計師報告掃描的安全隱患。

具體的安全隱患頁面很專業。但有個缺點,點選一個security issue list中的一個item進入子頁面,而後再點瀏覽器的返回按鈕後,不能返回先前的頁面,而是返回所有security issue list的第一個list頁面,在這點上,使用者體驗很糟糕,因為本來出來的列表就很長了,看的很暈了,返回頁面又不是先前的頁面,導致很多時間都花費在重新找尋先前的list頁面上了。

解決辦法:

  1. 點選掃描列表上的"File"列標籤,將掃描出來的列表按照檔案排序,然後點選右上角的某個按鈕,匯出成.csv格式檔案。
  2. 用Excel開啟.csv檔案,新增一列,記錄狀態,比如:Done, In progress, Cannot decide 等等。
  3. 按照.csv檔案條目的順序自上而下挨個處理。每做完一個條目,就更新對應的.csv檔案中對應行的新加列。
  4. 注意,每當要處理下一個條目時,從.csv檔案中copy出該條目的ID號,貼上到Coverity頁面的右上角的搜尋欄中,搜尋,並進入具體頁面。這樣做,可以免除上面提到的“因條目過多導致前進後退時迷失方向”的問題。

按照這樣的方法,處理完所有的條目,會得到一個完整的條目狀態列表。如果有未解決的條目的話,接下來就只關注這些條目。不會出現條目遺漏,也不會因條目過多而迷失方向。即安全又節省時間。

Coverity多次檢測同樣的程式碼(兩次之間,被檢測的程式碼有改動),不會覆蓋先前的報告,即第一次檢測得到的report item number還是有效的,不會被新的report item覆蓋,搜尋它仍然可以檢視先前檢測出來的問題。

其實Coverity檢測也是有缺陷的,畢竟它只是個輔助工具,不能完全達到人的水平,有時報的問題其實不是問題。例如,它可能報告有個指標pNext在沒有在被賦值或被賦值為NULL的情況下做pNext++操作存在風險,其實這個pNext指標在pNext=NULL下面的一個while迴圈中被賦值了,於是,這個報告可以被忽略。像這樣的誤報,目前還沒找到方法有效地過濾掉。

附:

===================================

產品名稱:Coverity原始碼缺陷分析工具
產品型號:Coverity

原始碼缺陷分析工具

Coverity Static Analysis

Coverity公司是由一流的斯坦福大學的科學家於2002年成立的,產品核心技術是1998年至2002年在斯坦福大學計算機系統實驗室開發的,用於解決一個電腦科學領域最困難的問題,在2003年釋出了第一個能夠幫助Linux、FreeBSD等開源專案檢測大量關鍵缺陷的系統,Coverity是唯一位列IDC前10名軟體質量工具供應商的靜態分析工具廠商,被第三方權威調查機構VDC評為靜態原始碼分析領域的領導者,市場佔有率處於絕對領先地位。

美國Coverity公司提供最先進的和可配置的用於檢測軟體缺陷和安全隱患的靜態原始碼分析解決方案,Coverity將基於布林可滿足性驗證技術應用於原始碼分析引擎,分析引擎利用其專利的軟體DNA圖譜技術和meta-compilation技術,綜合分析原始碼、編譯構建系統和作業系統等可能使軟體產生的缺陷,Coverity是第一個能夠快速、準確分析當今的大規模(幾百萬、甚至幾千萬行的程式碼)、高複雜度程式碼的工具,Coverity解決了影響原始碼分析有效性的很多關鍵問題:構建整合、編譯相容性、高誤報率、有效的錯誤根源分析等。

產品功能

Coverity Static Analysis (也稱Prevent)是檢測和解決C、C++、Java和C#原始碼中最嚴重的缺陷的領先的自動化方法。通過對您的構建環境、原始碼和開發過程給出一個完整的分析,Prevent建立了獲得高質量軟體的標準。

靜態原始碼分析允許我們在軟體開發生命週期的早期階段發現和修復缺陷,節省數以百萬計的相關成本。Prevent是業界標準,因為只有Coverity理解和掌握靜態原始碼分析技術所具有的嚴格的要求。

l Coverity瞭解構建系統——Prevent通過在作業系統流程這個層次監測您的構建系統來獲得每一個操作的清晰檢視,展現您的軟體。

l Coverity瞭解原始碼——Prevent 檢測比當今市場上任何其他工具都更多的原始碼資訊;程式碼的結構、含義和意圖都被用來揭示其中的嚴重的錯誤和不安全性。

l Coverity瞭解開發者——Prevent 通過一個客戶化的工作流、功能強大的分析器和易於使用的工具,能夠使缺陷在幾分鐘內被定位,解決缺陷。

平臺支援:

目標機平臺:PowerPC,ARM,MIPS,x86,SPARC,XScale,SH,Codefire,SH,ST 20,8051,

TI DSP C3000/C6000/C55x/C54x, Motorola 68HC05/68HC11, Freescale 68HC08/HCS08/68HC12/HCS12X, Renesas M16C/H8/M32C,

C51/C166/C251等;

嵌入式作業系統:VxWorks,Embedded Linux,QNX,RTEMS,ucOS,WinCE,Windows Embedded,PalmOS,Symbian, pSOS、Nucleus、ThreadX, INTEGRITY、OSE,UCLinux,國產OS等等;

主機平臺:Apple Mac OS X 10.4,Cygwin,FreeBSD,HPUX,Linux,Mac OS X , NetBSD(2.0) ,Solaris Sparc ,Solaris X86,Windows等;

支援的編譯器:ARM ADS/RVCT,Freescale Codewarrior ,GNU C/C++ ,Green Hills

HP aCC,i-Tech PICC,IAR,Intel C/C++ ,Marvell MSA ,Microsoft Visual C++,QNX ,Renesas ,Sun C/C++ ,TI Code Composer ,Wind River,

支援任何其他的ANSI C相容的編譯器.

產品特點及優勢

Coverity產品專長於準確的查詢最嚴重和最難檢測的缺陷,具有以下優勢:

精確性——Coverity Prevent的特別之處在於查詢精確,具有業界最低的誤報率(小於15%)。當許多其他的原始碼分析產品以很高的誤報率使得其不可用時,Coverity的虛假路徑裁剪、統計分析和其它創新減少了誤報的產生。附加的配置和微調能夠進一步減少誤報率。

分析的深度——Coverity Prevent提供過程間資料流分析和統計分析,評審整個程式的互動和所有的可能的路徑。Coverity Prevent檢查企業特定的APIs和標誌使用中的不一致性,精確的檢測QA、安全評審和現場會發生的缺陷。

分析的廣度——Coverity Prevent採用查詢最嚴重的錯誤的最先進的技術,提高您的產品的質量和安全性。Coverity Prevent可以檢測嚴重的問題,例如系統崩潰、記憶體洩漏、記憶體錯誤、不確定行為、併發缺陷和安全性問題。

低擁有成本——Coverity Prevent無縫的與您已有的環境整合,能夠快速部署和配置。

可擴充套件——Coverity Prevent使您能夠在我們的強大的分析引擎上建立定製的檢查器,來滿足您的開發組織和程式碼的特定需求。您可以設定定製的規則,來強化編碼標準或者檢測程式碼中的錯誤。

強大的可配置性——Coverity Prevent能夠快速的分析您的程式碼,不需要寫測試用例。通常百萬行的程式碼僅需要幾個小時,其他的工具需要幾天,甚至幾個星期來分析大規模程式碼。

廣泛的平臺支援——Coverity Prevent支援最廣泛的編譯器和硬體平臺,可最大化的滿足使用者多平臺的測試要求。

以 C/C++為例

Prevent 分析引擎使得缺陷檢測檢查器擁有原始碼最精確的描述。

Prevent 針對C/C++的分析引擎

引擎 功能
路徑流程引擎 通過構建一個表示經過每一個函式的所有的路徑的圖表分析您程式碼中的每個函式的控制流
資料追蹤引擎 用於分析從程式中每個路徑中的宣告收集的所有的整型和布林型等資料
統計引擎 用於分析您的程式碼作為一個整體的行為特徵
過程間呼叫總結引擎 一個主要的創新,使得Prevent 可以執行整個程式的分析,分析檔案間和模組間的任何層次的複雜的呼叫鏈
型別流程引擎 用於提高C++分析中依賴於類層次關係的報告的結果的精度
虛假路徑引擎 用於分析每個分支條件,以確定在當前路徑它將是真、假或不確定
加速引擎 儲存橫越每個路徑時的每個缺陷分析所收集的資訊;消除冗餘路徑,不需要橫越任何不必要的路徑來找到最多的缺陷
資料傳播引擎 把過程間呼叫總結引擎產生的所有總結和資料追蹤引擎記錄的所有資料彙總起來,是Coverity特有的、上下文敏感的過程間分析能力的關鍵
增量分析引擎 通過快取分析資料來提高效能,以便後續的分析僅需要包含變化的資料
能夠發現的C/C++缺陷(部分) C/C++安全性問題(部分)

併發

  • 死鎖
  • 錯誤使用的阻塞呼叫

效能下降

  • 記憶體洩漏
  • 檔案控制代碼洩漏
  • 定製的記憶體和網路資源洩漏
  • 資料庫連線洩漏

導致崩潰的缺陷

  • 空指標引用
  • 釋放後引用
  • 多次釋放
  • 不正確的記憶體分配
  • 不匹配的陣列新建/刪除

不正確的程式行為

  • 邏輯錯誤導致的死程式碼
  • 未初始化變數
  • 負數的無效引用

不正確的APIs使用

  • STL使用錯誤
  • API錯誤處理