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提示和代碼檢查.所以使用最新的檢查庫,可以帶來更全面的檢查,以提高代碼質量和健壯性。
參考:
