使用TscanCode和scan-build進行靜態分析

作過iOS開發的都知道Xcode集成的Analyzer能夠進行代碼靜態檢查,並且確實能夠幫助分析一些潛在的bug。今天就說一說在Linux開發環境下的兩款靜態分析工具TscanCodescan-buildhtml

目前市面上的靜態分析工具不少,爲何只拿這兩個工具呢?相對於商業軟件,它們的性能不是最優的,但倒是免費工具中比較出色的。前端

TscanCode是騰訊出品的開源靜態代碼掃描工具,scan-build則是LLVM的前端工具Clang所提供的靜態分析工具,XcodeAnalyzer就是藉助於scan-build來完成靜態分析的,做爲蘋果開源的項目,其質量仍是有保證的。linux

TscanCode

TscanCode是一款靜態代碼掃描工具,TscanCode旨在助力開發與測試人員從代碼層面挖掘問題,將那些長期困擾項目的諸如空指針宕機等問題,扼殺於萌芽階段。支持用戶根據不一樣需求自定義配置檢查項,有極強的擴展性和可維護性。平均掃描速度10W行/分鐘。c++

TscanCode支持如下類型規則掃描:git

  1. 空指針檢查,包含可疑的空指針,判空後解引用好比Crash等共3類subid檢查。
  2. 數據越界,Sprintf_S越界共1類subid檢查。
  3. 內存泄漏,分配和釋放不匹配同1類subid檢查。
  4. 邏輯錯誤,重複的代碼分支,bool類型和INT進行比較,表達式永遠True或者false等共18類檢查。
  5. 可疑代碼檢查,if判斷中含有可疑的=號,自由變量返回局部變量等共計15類檢查。
  6. 運算錯誤,判斷無符號數小於0,對bool類型進行++自增等,共計11類檢查。

詳細的使用文檔在其github倉庫中,有專門的用戶手冊能夠查閱。github

咱們以開源的cgdb爲例,用TscanCode來掃描一下這個項目。web

  1. 咱們將TscanCode工程release/linux_bin目錄下Linux平臺的可執行文件TscanCode和規則配置文件夾TscanCodeConfig拷貝到cgdb工程的根目錄。ide

  2. cgdb的根目錄執行如下命令:工具

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

參數解析:
--xml:按照xml格式輸出結果文件
./ : 須要掃描檢查的代碼路徑,此處爲全部文件。
--writefile :結果輸出文件
--configpath: 指定配置文件的路徑
更多參數能夠直接執行TscanCode查看oop

  1. 執行完畢之後,咱們能夠打開result.xml看看掃描結果。

     

    result.xml

     

    能夠看出來,仍是掃描出很多潛在漏洞的。

scan-build

Scan-build 是一個命令行工具,它可以幫助使用者運行靜態分析器檢查他們的代碼, 找出代碼的缺陷。

當一個項目在構建中,源文件在編譯時同時也被靜態分析器有序的檢查着。當構建完成時,結構將會做爲一個web網頁的形式呈現給使用者。

你如何編寫代碼與scan-build是沒有任何關係的。經過重寫cc和cxx環境變量來改變你的編譯環境,scan-build可使用一個僞編譯器代替原來那個能夠正常構建你的項目的編譯器。默認狀況下,這個僞編譯器使用gcc來編譯你的代碼,而後執行靜態分析器進行代碼分析。

scan-build的基本使用方式很簡單,只需在你的命令行開頭輸入scan-build便可。詳細參數以下:

[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的工程來講,須要先執行如下命令:

scan-build ./configure

這個配置腳本須要在scan-build中運行是由於scan-build能經過介入到編譯器來掃描你的源文件。scan-build將編譯器gcc設置爲analyze-ccanalyze-cc做爲一個僞編譯器,轉發命令行參數給gccclang來執行靜態分析。

而後執行如下命令,便可開始進行靜態分析。

scan-build make

仍是用cgdb來進行測試,由於須要經過configure生成Makefile,因此執行如下命令:

sh autogen.sh
scan-build -o cgdb-scan ./configure --prefix=$PWD/build
scan-build -o cgdb-scan make

執行完畢,提示到cgdb-scan目錄下查看結果。我將結果拷貝到Windows中進行查看。

result

打開index.html,會有驚喜等着你。由於scan-build是在隨着編譯過程進行分析,因此其分析結果很是漂亮,和Xcode中的 Analyzer幾乎如出一轍。

先看看概要

 

Bug Summary

詳細內容能夠點擊查看

 

Paste_Image.png

隨便挑一個Memory leak看看

Paste_Image.png

Paste_Image.png

Paste_Image.png

詳細的出錯步驟,是否是很清楚?平常開發中,能夠結合兩種工具進行分析。

做者:咕咕鷄 連接:https://www.jianshu.com/p/f99d9a5d25ac 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索