天天看點

如何用clang analyzer定制靜态分析規則(1)工程配置篇

OS X、iOS開發都很熟悉clang,這個編譯器前端支援C、C++、Objective-C、Objective-C++,是Mac世界裡最主要的編譯工具。

clang static analyzer(以下簡稱clang analyzer)是基于clang開發的官方靜态代碼分析工具,用于在編譯階段提前發現代碼問題,具體資訊請見官方網站:https://clang-analyzer.llvm.org/。關于clang analyzer的使用,網上文章很多,本文不再贅述,隻介紹如何基于這個靜态分析器,開發自己的分析規則,實作技術和業務上的需求。

1、準備工作

1.1、編譯工具

詳見:

http://llvm.org/docs/GettingStarted.html#requirements

http://clang.llvm.org/get_started.html

主要的是:

* clang >= 3.1

* CMake >= 3.4.3

* python >= 2.7

* svn / git

其實隻要是用Mac電腦開發的,基本都滿足條件了。雖然llvm和clang在Windows系統上也可以編譯,但是……那樣的需求可能比較少,本文不做展開。

1.2、llvm & clang源碼

clang analyzer是基于clang建構的,clang又是llvm編譯器最主要的前端,事實上,它們的源碼本來也是在一起的。官方文章 http://clang.llvm.org/get_started.html 是大家編譯clang代碼的指南,那裡面源碼倉庫還是用的svn的。但其實,官方倉庫自己也在往git遷,我們還是使用git倉庫:

http://llvm.org/git/llvm.git

http://llvm.org/git/clang.git

或者用github上這個非官方的mirror也行(每5分鐘同步一次):

https://github.com/llvm-mirror

2、編譯流程

2.1、建立源碼目錄

mkdir -p ~/projects/analyzer
cd ~/projects/analyzer           

2.2、checkout源碼

git clone http://llvm.org/git/llvm.git -b release_40
git clone http://llvm.org/git/clang.git llvm/tools/clang -b release_40           

這裡需要說明的是:

(1)clang目前最新release版本是4.0.0,而我們主要目的是基于clang定制靜态分析規則,不是開發clang的新特性,是以請checkout 4.0.0的代碼。

(2)如果隻是開發靜态分析規則,到此已經足夠,如果還對其他工具有興趣,可以繼續

git clone http://llvm.org/git/clang-tools-extra.git llvm/tools/clang/tools/extra -b release_40
git clone http://llvm.org/git/compiler-rt.git llvm/projects/compiler-rt -b release_40           

2.3、建立Xcode工程

mkdir -p ~/projects/analyzer/build
cd ~/projects/analyzer/build
cmake -G "Xcode" ../llvm           

注意:cmake可以為多種編譯工具建立編譯配置,官方文檔使用

cmake -G "Unix Makefiles" <llvm_source_path>           

來建立GNU make的編譯配置。但是,在Mac上開發,我們怎麼能抛棄Xcode呢?是以本文是使用Xcode來進行編譯的。

cmake還有個常用參數CMAKE_BUILD_TYPE用來指定生成的編譯配置類型,一般用Debug、Release。

cmake -G "Unix Makefiles" CMAKE_BUILD_TYPE="Debug" <llvm_source_path>           

這個值預設是Debug,是以如果你采用GNU make來做指令行編譯,那需要小心指定。但本文用的是Xcode,我們可以暫時忽略這點,因為後期能在Xcode裡設定。

如何用clang analyzer定制靜态分析規則(1)工程配置篇

2.4、打開Xcode工程

open LLVM.xcodeproj           

當打開Xcode工程時,Xcode會有如下提示:

如何用clang analyzer定制靜态分析規則(1)工程配置篇

如果你已經比較熟悉llvm & clang工程結構,那建議還是選“Manually Manage Schemes”吧,因為cmake為我們自動生成的scheme實在是太多了……關鍵是,如果我們隻想開發靜态分析規則,大部分scheme是用不到的,而且我們其實并不需要編譯那麼多子產品。

對于新手,我們選擇“Automatically Create Schemes”。

進入Xcode後,請選擇“Manage Schemes…”,将大部分Scheme隐藏:

如何用clang analyzer定制靜态分析規則(1)工程配置篇

我們其實隻需要clang一個scheme就夠了:

如何用clang analyzer定制靜态分析規則(1)工程配置篇

然後就是出去吃個飯,等Xcode的Indexing完成,這個過程有點久……

如何用clang analyzer定制靜态分析規則(1)工程配置篇

2.5、編譯clang

選擇clang scheme,開始Build,完成後我們便得到了

clang toolchain:

~/projects/analyzer/build/Debug/bin

和對應的lib庫:

~/projects/analyzer/build/Debug/lib

如何用clang analyzer定制靜态分析規則(1)工程配置篇

值得一提的是,在Xcode工程裡有個scheme叫clangStaticAnalyzerCheckers,對應的Build結果就是lib目錄下的clang analyzer官方規則庫

~/projects/analyzer/build/Debug/lib/libclangStaticAnalyzerCheckers.a

如何用clang analyzer定制靜态分析規則(1)工程配置篇

如果想要單獨修改/調試這個預設的規則庫,以後可以單獨Build clangStaticAnalyzerCheckers,然後再Build clang。我們從clang analyzer官網下載下傳的安裝包裡,clang自帶規則庫也是靜态連結的。

到此為止,clang analyzer開發所需工程配置完畢。另外,以上步驟其實對于用Xcode編譯或開發clang其他的功能也是适用的。