做過iOS開發(fā)的都知道Xcode集成的Analyzer可以進(jìn)行代碼靜態(tài)檢查,而且確實(shí)可以幫助分析一些潛在的bug。今天就說一說在Linux開發(fā)環(huán)境下的兩款靜態(tài)分析工具TscanCode和scan-build。
目前市面上的靜態(tài)分析工具很多,為什么只拿這兩個(gè)工具呢?相對于商業(yè)軟件,它們的性能不是最優(yōu)的,但卻是免費(fèi)工具中比較出色的。
TscanCode是騰訊出品的開源靜態(tài)代碼掃描工具,scan-build則是LLVM的前端工具Clang所提供的靜態(tài)分析工具,Xcode的Analyzer就是借助于scan-build來完成靜態(tài)分析的,作為蘋果開源的項(xiàng)目,其質(zhì)量還是有保證的。
TscanCode
TscanCode是一款靜態(tài)代碼掃描工具,TscanCode旨在助力開發(fā)與測試人員從代碼層面挖掘問題,將那些長期困擾項(xiàng)目的諸如空指針宕機(jī)等問題,扼殺于萌芽階段。支持用戶根據(jù)不同需求自定義配置檢查項(xiàng),有極強(qiáng)的擴(kuò)展性和可維護(hù)性。平均掃描速度10W行/分鐘。
TscanCode支持以下類型規(guī)則掃描:
- 空指針檢查,包含可疑的空指針,判空后解引用比如Crash等共3類subid檢查。
- 數(shù)據(jù)越界,Sprintf_S越界共1類subid檢查。
- 內(nèi)存泄漏,分配和釋放不匹配同1類subid檢查。
- 邏輯錯(cuò)誤,重復(fù)的代碼分支,bool類型和INT進(jìn)行比較,表達(dá)式永遠(yuǎn)True或者false等共18類檢查。
- 可疑代碼檢查,if判斷中含有可疑的=號(hào),自由變量返回局部變量等共計(jì)15類檢查。
- 運(yùn)算錯(cuò)誤,判斷無符號(hào)數(shù)小于0,對bool類型進(jìn)行++自增等,共計(jì)11類檢查。
詳細(xì)的使用文檔在其github倉庫中,有專門的用戶手冊可以查閱。
我們以開源的cgdb為例,用TscanCode來掃描一下這個(gè)項(xiàng)目。
我們將
TscanCode工程release/linux_bin目錄下Linux平臺(tái)的可執(zhí)行文件TscanCode和規(guī)則配置文件夾TscanCodeConfig拷貝到cgdb工程的根目錄。在
cgdb的根目錄執(zhí)行以下命令:
./TscanCode --xml ./ --writefile=./result.xml --configpath=./TscanCodeConfig
參數(shù)解析:
--xml:按照xml格式輸出結(jié)果文件
./ : 需要掃描檢查的代碼路徑,此處為所有文件。
--writefile :結(jié)果輸出文件
--configpath: 指定配置文件的路徑
更多參數(shù)可以直接執(zhí)行TscanCode查看
-
執(zhí)行完畢以后,我們可以打開result.xml看看掃描結(jié)果。
result.xml
可以看出來,還是掃描出不少潛在漏洞的。
scan-build
Scan-build 是一個(gè)命令行工具,它能夠幫助使用者運(yùn)行靜態(tài)分析器檢查他們的代碼, 找出代碼的缺陷。
當(dāng)一個(gè)項(xiàng)目在構(gòu)建中,源文件在編譯時(shí)同時(shí)也被靜態(tài)分析器有序的檢查著。當(dāng)構(gòu)建完成時(shí),結(jié)構(gòu)將會(huì)作為一個(gè)web網(wǎng)頁的形式呈現(xiàn)給使用者。
你如何編寫代碼與scan-build是沒有任何關(guān)系的。通過重寫cc和cxx環(huán)境變量來改變你的編譯環(huán)境,scan-build可以使用一個(gè)偽編譯器代替原來那個(gè)可以正常構(gòu)建你的項(xiàng)目的編譯器。默認(rèn)情況下,這個(gè)偽編譯器使用gcc來編譯你的代碼,然后執(zhí)行靜態(tài)分析器進(jìn)行代碼分析。
scan-build的基本使用方式很簡單,只需在你的命令行開頭輸入scan-build即可。詳細(xì)參數(shù)如下:
[root@localhost cgdb]# scan-build
usage: scan-build [-h] [--verbose] [--override-compiler] [--use-cc <path>]
[--use-c++ <path>] [--intercept-first] [--status-bugs]
[--exclude <directory>] [--output <path>] [--keep-empty]
[--html-title <title>] [--plist | --plist-html]
[--use-analyzer <path>] [--no-failure-reports]
[--analyze-headers] [--stats] [--internal-stats]
[--maxloop <loop count>] [--store <model>]
[--constraints <model>] [--analyzer-config <options>]
[--force-analyze-debug-code]
[--load-plugin <plugin library>]
[--enable-checker <checker name>]
[--disable-checker <checker name>] [--help-checkers]
[--help-checkers-verbose]
...
scan-build: error: missing build command
對于那些需用通過configure命令生成Makefile的工程來說,需要先執(zhí)行以下命令:
scan-build ./configure
這個(gè)配置腳本需要在scan-build中運(yùn)行是因?yàn)?code>scan-build能通過介入到編譯器來掃描你的源文件。scan-build將編譯器gcc設(shè)置為analyze-cc。analyze-cc作為一個(gè)偽編譯器,轉(zhuǎn)發(fā)命令行參數(shù)給gcc和clang來執(zhí)行靜態(tài)分析。
然后執(zhí)行以下命令,即可開始進(jìn)行靜態(tài)分析。
scan-build make
還是用cgdb來進(jìn)行測試,因?yàn)樾枰ㄟ^configure生成Makefile,所以執(zhí)行以下命令:
sh autogen.sh
scan-build -o cgdb-scan ./configure --prefix=$PWD/build
scan-build -o cgdb-scan make
執(zhí)行完畢,提示到cgdb-scan目錄下查看結(jié)果。我將結(jié)果拷貝到Windows中進(jìn)行查看。

打開index.html,會(huì)有驚喜等著你。因?yàn)?code>scan-build是在隨著編譯過程進(jìn)行分析,所以其分析結(jié)果非常漂亮,和Xcode中的 Analyzer幾乎一模一樣。
先看看概要

詳細(xì)內(nèi)容可以點(diǎn)擊查看

隨便挑一個(gè)Memory leak看看



詳細(xì)的出錯(cuò)步驟,是不是很清楚?日常開發(fā)中,可以結(jié)合兩種工具進(jìn)行分析。
我是咕咕雞,一個(gè)還在不停學(xué)習(xí)的全棧工程師。
熱愛生活,喜歡跑步,家庭是我不斷向前進(jìn)步的動(dòng)力。
