使用TscanCode和scan-build進(jìn)行靜態(tài)分析

做過iOS開發(fā)的都知道Xcode集成的Analyzer可以進(jìn)行代碼靜態(tài)檢查,而且確實(shí)可以幫助分析一些潛在的bug。今天就說一說在Linux開發(fā)環(huán)境下的兩款靜態(tài)分析工具TscanCodescan-build

目前市面上的靜態(tài)分析工具很多,為什么只拿這兩個(gè)工具呢?相對于商業(yè)軟件,它們的性能不是最優(yōu)的,但卻是免費(fèi)工具中比較出色的。

TscanCode是騰訊出品的開源靜態(tài)代碼掃描工具,scan-build則是LLVM的前端工具Clang所提供的靜態(tài)分析工具,XcodeAnalyzer就是借助于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ī)則掃描:

  1. 空指針檢查,包含可疑的空指針,判空后解引用比如Crash等共3類subid檢查。
  2. 數(shù)據(jù)越界,Sprintf_S越界共1類subid檢查。
  3. 內(nèi)存泄漏,分配和釋放不匹配同1類subid檢查。
  4. 邏輯錯(cuò)誤,重復(fù)的代碼分支,bool類型和INT進(jìn)行比較,表達(dá)式永遠(yuǎn)True或者false等共18類檢查。
  5. 可疑代碼檢查,if判斷中含有可疑的=號(hào),自由變量返回局部變量等共計(jì)15類檢查。
  6. 運(yùn)算錯(cuò)誤,判斷無符號(hào)數(shù)小于0,對bool類型進(jìn)行++自增等,共計(jì)11類檢查。

詳細(xì)的使用文檔在其github倉庫中,有專門的用戶手冊可以查閱。

我們以開源的cgdb為例,用TscanCode來掃描一下這個(gè)項(xiàng)目。

  1. 我們將TscanCode工程release/linux_bin目錄下Linux平臺(tái)的可執(zhí)行文件TscanCode和規(guī)則配置文件夾TscanCodeConfig拷貝到cgdb工程的根目錄。

  2. cgdb的根目錄執(zhí)行以下命令:

./TscanCode --xml ./ --writefile=./result.xml --configpath=./TscanCodeConfig

參數(shù)解析:
--xml:按照xml格式輸出結(jié)果文件
./ : 需要掃描檢查的代碼路徑,此處為所有文件。
--writefile :結(jié)果輸出文件
--configpath: 指定配置文件的路徑
更多參數(shù)可以直接執(zhí)行TscanCode查看

  1. 執(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ù)給gccclang來執(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)行查看。

result

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

先看看概要


Bug Summary

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


Paste_Image.png

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

Paste_Image.png
Paste_Image.png
Paste_Image.png

詳細(xì)的出錯(cuò)步驟,是不是很清楚?日常開發(fā)中,可以結(jié)合兩種工具進(jìn)行分析。

我是咕咕雞,一個(gè)還在不停學(xué)習(xí)的全棧工程師。
熱愛生活,喜歡跑步,家庭是我不斷向前進(jìn)步的動(dòng)力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容