天天看點

如何用clang analyzer定制靜态分析規則(2)建立定制規則庫篇如何用clang analyzer定制靜态分析規則(2)建立定制規則庫篇

如何用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。

如何用clang analyzer定制靜态分析規則(2)建立定制規則庫篇如何用clang analyzer定制靜态分析規則(2)建立定制規則庫篇

直接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 。

繼續閱讀