Clang Static Analyzer - 靜態代碼分析工具


Clang Static Analyzer - 靜態代碼分析工具

LLVM不僅僅是一個編譯器,同時提供了模塊化的功能和庫,用於編譯器的開發和功能擴展。常規的一個編譯器分為前端、優化器和后端,LLVM編譯器也不例外,Clang就是屬於一個編譯器的前端部分,LLVM屬於優化器和后端,當然LLVM也可以支持其他類型的前端,比如GCC前端編譯器。

基礎擴展

1.傳統編譯器是一個三層模型結構,包括前端編譯器、優化器、后端編譯器。

  • 前端主要負責源代碼的編譯解析、錯誤檢查以及生成抽象語法樹。
  • 優化器主要負責對語法樹的優化,以提高代碼的運行時間,比如消除冗余計算等。
  • 后端主要負責將優化后的中間代碼轉成機器碼,這個階段會針對不同的機器架構、指令集優化以提高代碼的執行性能。

2.LLVM是Low Level Virtual Machine的首字母縮寫。 本來是一個低級別的虛擬機,但現在它是一種編譯器的基礎程序集合,包括一些LLVM中介碼、LLVM除錯工具等,它利用虛擬技術(中介碼)為開發語言的編譯期、鏈接期、運行期以及閑置期提供了優化和改良。

3.Clang是一個前端編譯器,Clang只支持C家族的三門語言C、C++和Objective-C,相比於GCC,Clang的優勢在於速度快、內存占用體積小、模塊化、診斷信息可讀性強、設計清晰擴展性強等。

4.靜態檢查工具說明

  • scan-build: 運行分析器的高級命令行工具。
  • scan-view: 查看scan-build生成的分析結果。

clang安裝

1.apt安裝

sudo apt-get install clang
sudo apt-get install llvm

注意:如果這樣安裝完成后執行scan-build提示沒有此命令,需要單獨將scan-build安裝或改用下面兩種方式安裝。

2.官網下載整包安裝

在llvm的官網 可以查看已經編譯好的各個平台的release版本,Clang也會作為llvm release的一部分一起發布

3.源碼編譯安裝

參考官網 上的步驟,下載源碼后配置一下cmake,編譯、安裝即可。

可以先安裝一些可能用到的工具:

sudo apt install gcc
sudo apt install g++
sudo apt install make
sudo apt install cmake 

使用

static analyzer的實質是提供了一個fake compiler,在真正的compile完成之后,進行analyzer

1.安裝好后, make 之前加上 scan-build 就可以了。

scan-build --use-analyzer `which clang` make
  • scan-build 需要指定 clang 的路徑。所以需要設置--use-analyzer
  • 使用-o選項,可以指定輸出報告的存放位置。默認是/tmp目錄下。

2.結合autoconf,cmake等工具掃描實際項目

scan-build ./configure
scan-build make

cmake -DCMAKE_C_COMPILER=ccc-analyzer -DCMAKE_CXX_COMPILER=c++-analyzer ..

3.checker-檢查規則

內置的 checker 存放在 ../llvm/tools/clang/lib/StaticAnalyzer/Checkers 目錄下。 這些 checker默認情況下並沒有全部開啟,所以需要根據情況啟用合適的 checker。可以使用-enable-checker-disable-checker開啟和禁用具體的 checker 或者某種類別的 checker。

如:

scan-build -enable-checker alpha.security.ArrayBoundV2 ... # 啟用數組邊界檢查

4.相關參數

$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

查看結果

1.若代碼存在問題,會生成html報告,否則不生成。

2.生成成功后,可在瀏覽器直接打開查看,也可以使用scan-view命令進行查看。

3.生成位置若不指定則在/tmp下。

靜態檢查知識補充

使用靜態分析庫有幾個注意點:

  • 持續更新,不斷優化
    代碼檢查庫一直計划提升代碼檢查的精確度和范圍,優化查找bug的方式,對於靜態代碼檢查有一些基本的限制,可優化的空間還有很大.
  • 比編譯耗時
    使用靜態代碼檢查自動查找程序bug其實是使用CPU時間來換更高的代碼質量.靜態分析要比編譯耗時.
    即使Clang在速度和輕量級上盡可能進行了優化,但是也不要期待會比項目編譯更快.一些用於查找bug的代碼最差時需要指數級的時間消耗.
  • 檢測失誤
    靜態檢測並不是完美的,可能正確的代碼也會出現一些錯誤的bug提示,因為不同代碼需要的檢查精度不同,我不同的檢查規則中,可能會出現不同頻率的檢測失誤,Clang一直在盡力減少這種失誤,但目前並沒有完全避免.
  • 並未100%覆蓋全部bug
    靜態檢查只是找到了那寫常見的特定bug,但是對於某些bug還未覆蓋.

常見問題

1.Clang開源的代碼檢查庫更新比較頻繁,會有更多的bug提示和代碼檢查.所以使用最新的檢查庫,可以帶來更全面的檢查,以提高代碼質量和健壯性。

參考:

1.scan-build:從命令行運行分析器

2.llvm, clang 和 scan-build 的安裝和使用

3.Clang Static Analyzer


免責聲明!

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



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