如何用clang analyzer定制靜态分析規則(2)建立定制規則庫篇
在上一篇《工程配置篇》裡,我們已經了解了如何下載下傳llvm和clang的源碼,如何生成Xcode工程并完成編譯,現在就開始定制自己的靜态分析規則。
首先要明确的兩點,一是clang自己的build target基本是靜态連結的,但我們要做的是獨立釋出、獨立加載的規則庫,必須做成動态連結。二是開發靜态分析規則,完全依賴clang提供的能力,考慮到開發、調試的友善,規則庫工程将被建立在clang工程下。
我們實作的機制是應用了clang plugin機制,可參考 http://clang.llvm.org/docs/ClangPlugins.html 。具體到靜态分析規則開發,可以使用更簡單的checker plugin,詳細原理會在後面闡述,此處暫隻先說工程搭建。
1、CMake配置
clang analyzer的源碼在
~/projects/analyzer/llvm/tools/clang/lib/StaticAnalyzer
規則庫工程就建立在這裡。
為了跟其他target保持一緻,先建立CMake配置:
target名:clangSquirrelCheckers
規則庫包含檔案清單:
SuspiciousSizeofChecker.cpp(規則路徑:”squirrel.defect.SuspiciousSizeof”)
~/projects/analyzer/llvm/tools/clang/lib/StaticAnalyzer
|-- CMakeLists.txt
|-- Checkers
|- ......
`- ......
|-- Core
|- ......
`- ......
|-- Frontend
|- ......
`- ......
|-- README.txt
`-- SquirrelCheckers
|-- CMakeLists.txt
`-- SuspiciousSizeofChecker.cpp
#~/projects/analyzer/llvm/tools/clang/lib/StaticAnalyzer/SquirrelCheckers/CMakeLists.txt
IF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
SET(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
ENDIF()
add_clang_library(clangSquirrelCheckers
SuspiciousSizeofChecker.cpp
SHARED
)
這裡要備注的是,add_clang_library是clang定義的一個宏,在
~/projects/analyzer/llvm/tools/clang/cmake/modules/AddClang.cmake
我們需要建立動态連結的.dylib,是以使用了SHARED。
2、Xcode工程
按照前文《工程配置篇》裡的步驟,Xcode工程打開時會多了一個scheme clangSquirrelCheckers。
直接Build,在Debug/lib(根據Build configuration)下就可以得到libclangSquirrelCheckers.dylib
3、使用
clang的plugin可以通過
-load ooxx.dylib
來加載。之後,便像内置掃描規則一樣使用。例如:
可以檢查定制規則是否正常加載
clang -cc1 -load ~/projects/analyzer/build/Debug/lib/libclangSquirrelCheckers.dylib -analyzer-checker-help
可以直接用于掃描
clang -cc1 -load ~/projects/analyzer/build/Debug/lib/libclangSquirrelCheckers.dylib -analyze ooxx.cpp
4、源碼
本系列文章源碼可見 https://github.com/squirrel-explorer/eagleeye-ios 。