軟件工程:代碼靜態分析工具


什么是靜態代碼分析工具呢?

用一句最直白的話就是:在代碼運行前的一個檢查代碼規范,錯誤等的分析並提出建議的工具

這里有這么幾個關鍵詞:

 

  • 代碼運行前:很明顯,這個工具就是對文本代碼進行分析的,不用編譯等等
  • 檢查:它是一個具有一定的分析智能的工具,可以分析出野指針,未達代碼等錯誤的工具,而不是一個簡簡單單的類似於在一個IDE里開發,寫錯東西會提示的工具,它是這個東西的超超級加強版!
  • 靜態分析是提出建議的,但並非所有的建議都是可取的,要理性對待(就像在Eclipse里的黃色警告,你都不一定會全部處理是一樣的)

 

 

這個工具可能會發現的錯誤:

 

  • 變量聲明了但未使用
  • 變量類型不匹配
  • 變量在使用前未定義
  • 不可達代碼
  • 死循環
  • 數組越界
  • 內存泄漏

 

 

在什么情況下使用靜態代碼分析工具?

 

  • 代碼審查
  • 代碼自查
  • 代碼規范
  • 代碼編譯前
 
摘圖:
靜態分析工具位置

 

 

針對C語言的開源程序靜態分析工具——splint

splint

掌握了“靜態分析”等概念之后,我們再來看splint

舉一個小例子(摘文):

在Linux命令行下,splint的使用很簡單,檢測文件*.c,只要這樣使用就可以了:

  1. splint splint_msg.c
splint消息

我們通過以下例子來認識典型的splint告警信息:

  1. //splint_msg.c
  2. int func_splint_msg1(void)
  3. {
  4. int a;
  5. return0;
  6. }
  7. int func_splint_msg2(void)
  8. {
  9. int* a =(int*)malloc(sizeof(int));
  10. a = NULL;
  11. return0;
  12. }
運行splint splint_msg.c之后,我們來看輸出的告警信息:
  1. splint_msg.c:(in function func_splint_msg1)
  2. splint_msg.c:4:6:Variable a declared but not used
  3. A variable is declared but never used.Use/*@unused@*/ in front of
  4. declaration to suppress message.(Use-varuse to inhibit warning)
  5. splint_msg.c:(in function func_splint_msg2)
  6. splint_msg.c:10:2:Fresh storage a (type int*) not released before assignment:
  7. a = NULL
  8. A memory leak has been detected.Storage allocated locally is not released
  9. before the last reference to it is lost.(Use-mustfreefresh to inhibit
  10. warning)
  11. splint_msg.c:9:37:Fresh storage a created
  12. Finished checking ---2 code warnings

藍色字體部分:給出告警所在函數名,在函數的第一個警告消息報告前打印;

紅色字體部分:消息的正文,文件名、行號、列號顯示在的警告的正文前;

黑色字體部分:是有關該可疑錯誤的詳細信息,包含一些怎樣去掉這個消息的信息;

綠色字體部分:給出格外的位置信息,這里消息給出了是在哪里申請了這個可能泄露的內存

 

檢查控制

splint提供了三種方式可進行檢查的控制,分別是.splintrc配置文件、flags標志和格式化注釋。

flags:splint支持幾百個標志用來控制檢查和消息報告,使用時標志前加’+‘或’-’,'+'標志開啟這個標志,'-'表示關閉此標志,下面例子展示了flags標志的用法:

splint -showcol a.c   //在檢測a.c時,告警消息中列數不被打印
splint -varuse a.c //在檢測a.c時,告警消息中未使用變量告警不被打印

.splintrc配置文件:在使用源碼安裝splint之后,.splintrc文件將被安裝在主目錄下,.splintrc文件中對一些標志作了默認的設定,命令行中指定的flags標志會覆蓋.splintrc文件中的標志。

格式化注釋:格式化注釋提供一個類型、變量或函數的格外的信息,可以控制標志設置,增加檢查效果,所有格式化注釋都以/*@開始,@*/結束,比如在函數參數前加/*@null@*/,表示該參數可能是NULL,做檢測時,splint會加強對該參數的值的檢測

小結

現在,幾乎是每一種語言都有靜態語言分析工具,每一種語言分析的工具的能力有大有小,可以作參考使用,另外,值得注意的是,現在的工具,都可以搭配在GUI的界面上了 ,它也不再是一個丑陋的命令行工具了,這個是為了提高生產效率考慮的,所以當你尋找靜態分析工具時,盡量使用界面化的工具(如Eclipse的插件等)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM