什么是靜態代碼分析工具呢?
用一句最直白的話就是:在代碼運行前的一個檢查代碼規范,錯誤等的分析並提出建議的工具
這里有這么幾個關鍵詞:
- 代碼運行前:很明顯,這個工具就是對文本代碼進行分析的,不用編譯等等
- 檢查:它是一個具有一定的分析智能的工具,可以分析出野指針,未達代碼等錯誤的工具,而不是一個簡簡單單的類似於在一個IDE里開發,寫錯東西會提示的工具,它是這個東西的超超級加強版!
- 靜態分析是提出建議的,但並非所有的建議都是可取的,要理性對待(就像在Eclipse里的黃色警告,你都不一定會全部處理是一樣的)
這個工具可能會發現的錯誤:
- 變量聲明了但未使用
- 變量類型不匹配
- 變量在使用前未定義
- 不可達代碼
- 死循環
- 數組越界
- 內存泄漏
在什么情況下使用靜態代碼分析工具?
- 代碼審查
- 代碼自查
- 代碼規范
- 代碼編譯前

針對C語言的開源程序靜態分析工具——splint。
splint
掌握了“靜態分析”等概念之后,我們再來看splint
舉一個小例子(摘文):
在Linux命令行下,splint的使用很簡單,檢測文件*.c,只要這樣使用就可以了:
splint splint_msg.c
我們通過以下例子來認識典型的splint告警信息:
//splint_msg.c
int func_splint_msg1(void)
{
int a;
return0;
}
int func_splint_msg2(void)
{
int* a =(int*)malloc(sizeof(int));
a = NULL;
return0;
}
splint_msg.c:(in function func_splint_msg1)
splint_msg.c:4:6:Variable a declared but not used
A variable is declared but never used.Use/*@unused@*/ in front of
declaration to suppress message.(Use-varuse to inhibit warning)
splint_msg.c:(in function func_splint_msg2)
splint_msg.c:10:2:Fresh storage a (type int*) not released before assignment:
a = NULL
A memory leak has been detected.Storage allocated locally is not released
before the last reference to it is lost.(Use-mustfreefresh to inhibit
warning)
splint_msg.c:9:37:Fresh storage a created
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的插件等)