OCLint開發(fā)環(huán)境搭建,調(diào)試與自定義走查規(guī)則

1.安裝

1.1 下載源代碼

直接clone https://github.com/oclint/oclint官方源代碼,當(dāng)然你也可選擇最新realse版本。

1.2 構(gòu)建編譯oclint

進(jìn)入oclint-scripts文件夾,執(zhí)行,命令./make,此過程要點(diǎn)時間,執(zhí)行該命令之前需要安裝cmake;可能會遇到提醒安裝openssl,brew install openssl;可能會遇到提醒安裝ninjia,brew install ninjia。這些可能會遇到的問題,按命令行問題提示,處理掉就好,如果編譯失敗,將不能進(jìn)入下面的步驟。

2.調(diào)試

2.1 新建腳本管理xcode工程

安裝成功后,我們可以用xcode來管理,開發(fā)調(diào)試各種走查規(guī)則,且我們的每個規(guī)則都是一個scheme,編譯時,可以只選擇特定某規(guī)則調(diào)試,生成對應(yīng)的dylib,這樣編譯速度快,這是我已經(jīng)配置好的xcode調(diào)試工程,如圖:


image.png

新建該projcet命令:

//在OCLint源碼目錄下建立了一個文件夾,命名為oclint-kgclang-rules
mkdir oclint-kgclang-rules
cd oclint-kgclang-rules
cmake -G Xcode -D CMAKE_CXX_COMPILER=../build/llvm-install/bin/clang++  -D CMAKE_C_COMPILER=../build/llvm-install/bin/clang -D OCLINT_BUILD_DIR=../build/oclint-core -D OCLINT_SOURCE_DIR=../oclint-core -D OCLINT_METRICS_SOURCE_DIR=../oclint-metrics -D OCLINT_METRICS_BUILD_DIR=../build/oclint-metrics -D LLVM_ROOT=../build/llvm-install/ ../oclint-rules

那么接下來,我們就可以打開,運(yùn)行該工程。你會發(fā)現(xiàn)里面已經(jīng)集成了很多oclint開發(fā)的自定義走查腳本,這是極好的學(xué)習(xí)參考資料。具體,***/oclint/oclint-kgclang-rules目錄里面有oclint已經(jīng)自定義的腳本,這是一個可以build的xcode工程,但是暫時還不能調(diào)試,因我們的模板是dylib動態(tài)鏈接庫,這些動態(tài)鏈接庫可以一次性編譯,也可以選擇單個項(xiàng)目單獨(dú)編譯。如下圖:


image.png

2.1 靜態(tài)走查規(guī)則的動態(tài)鏈接庫調(diào)試

現(xiàn)在dylib,需要主程序來引導(dǎo)啟動,配置如下。


image.png

備注:啟動引導(dǎo)工程需要用/Users/ganvinalix/oclint/build/oclint-release/bin/oclintExe ,oclintExe為oclint的拷貝。

image.png

通過xcode配置

image.png

選擇自己拷貝的oclint編譯結(jié)果oclintExe(一定要編譯oclint成功后才有該文件夾)

image.png

接下來還需要配置入口調(diào)試參數(shù)(oclint可執(zhí)行文件的輸入?yún)?shù)):

image.png

命令如下:

-R=/Users/ganvinalix/oclint/oclint-kgclang-rules/rules.dl/Debug  /Users/ganvinalix/oclint/oclint-kgclang-rules/debug.m -- -x objective-c 

意思是,在我們自己oclint-kgclang-rules工程下新建一個調(diào)試文件debug.m。


image.png

準(zhǔn)備好用demo中的規(guī)則來檢測我們的debug.m文件吧。
如何調(diào)試自己工程呢? 自己的工程往往文件是依賴的,所以需要把依賴信息一起作為參數(shù)傳遞進(jìn)來。

 -R=/Users/ganvinalix/oclint/oclint-kgclang-rules/rules.dl/Debug  /Users/ganvinalix/Desktop/TestOClintProject/TestOClintProject/ViewController.m -- 
-x objective-c -arch x86_64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=gnu11 -fobjc-arc -fobjc-weak -fmodules -gmodules -fmodules-cache-path=/Users/ganvinalix/Library/Developer/Xcode/DerivedData/ModuleCache.noindex -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session-file=/Users/ganvinalix/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-framework-module -Wno-trigraphs -fpascal-strings -O0 -fno-common -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wdocumentation -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wimplicit-retain-self -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-float-conversion -Wnon-literal-null-conversion -Wobjc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wdeprecated-implementations -DDEBUG=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.4.sdk -fasm-blocks -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -mios-simulator-version-min=11.4 -g -Wno-sign-conversion -Winfinite-recursion -Wcomma -Wblock-capture-autoreleasing -Wstrict-prototypes -Wunguarded-availability -fobjc-abi-version=2 -fobjc-legacy-dispatch -index-store-path /Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Index/DataStore -iquote /Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/TestOClintProject-generated-files.hmap -I/Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/TestOClintProject-own-target-headers.hmap -I/Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/TestOClintProject-all-target-headers.hmap -iquote /Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/TestOClintProject-project-headers.hmap -I/Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Products/Debug-iphonesimulator/include -I/Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/DerivedSources/x86_64 -I/Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/DerivedSources -F/Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Products/Debug-iphonesimulator -MMD -MT dependencies -MF /Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/Objects-normal/x86_64/ViewController.d --serialize-diagnostics /Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/Objects-normal/x86_64/ViewController.dia -c /Users/ganvinalix/Desktop/TestOClintProject/TestOClintProject/ViewController.m -o /Users/ganvinalix/Library/Developer/Xcode/DerivedData/TestOClintProject-dborgnvcnbtwmndeqnvmjirynvrt/Build/Intermediates.noindex/TestOClintProject.build/Debug-iphonesimulator/TestOClintProject.build/Objects-normal/x86_64/ViewController.o

這么長,哪里來的?其實(shí)就是我們用xcode build的build log信息,上面的例子是調(diào)試我demo工程TestOClintProject下的ViewControlle.m文件,實(shí)際開發(fā)中是需要調(diào)試走查的特定項(xiàng)目的工程文件,可以說項(xiàng)目里面的任何其中一個.m文件都是有很多代碼庫依賴的,所以需要把所有的build信息包進(jìn)來。


image.png

2.2 自定義靜態(tài)代碼走查規(guī)則

之前我們是用oclint-kgclang-rules已有的子項(xiàng)目調(diào)試運(yùn)行。現(xiàn)在我們自己新增子項(xiàng)目。新增步驟如下,
A.如何新增子項(xiàng)目
以我的一個走查腳本為例,生成一個名為ViewCtrlMustHavePageID類型是ASTVisitor的規(guī)則模板,oclint根目錄執(zhí)行命令

oclint-scripts/scaffoldRule ViewCtrlMustHavePageID  -t ASTVisitor

執(zhí)行后會在/Users/ganvinalix/oclint/oclint-rules/rules/custom/下生產(chǎn)我們自己定義的插件腳本,以cmake管理的,如果不懂cmake可以先不用理會它。


image.png

然后回到我們的oclint-kgclang-rules oc工程下,重新執(zhí)行命令,

#! /bin/sh -e
cmake -G Xcode -D CMAKE_CXX_COMPILER=../build/llvm-install/bin/clang++  -D CMAKE_C_COMPILER=../build/llvm-install/bin/clang -D OCLINT_BUILD_DIR=../build/oclint-core -D OCLINT_SOURCE_DIR=../oclint-core -D OCLINT_METRICS_SOURCE_DIR=../oclint-metrics -D OCLINT_METRICS_BUILD_DIR=../build/oclint-metrics -D LLVM_ROOT=../build/llvm-install/ ../oclint-rules

建議上面命令改成.sh腳本文件方便調(diào)用,如我的:/Users/ganvinalix/oclint/oclint-kgclang-rules/create-xcode-rules.sh ,一切順利的話能看到:


image.png

重新打開之前創(chuàng)建的OC工程,可以看到子項(xiàng)目已經(jīng)新增成功了。


image.png

按步驟2.1,給我們新增的子項(xiàng)目,也配上調(diào)試參數(shù)。到這里,你的oclint已經(jīng)能調(diào)試了。但是如果不了解AST,還是看不懂源的代碼,也無法順利完成走查需求的。當(dāng)然如已經(jīng)鋪好,到達(dá)目的地,只是時間的問題。

3 AST簡易介紹.

3.1 一個很重的命令

把我們的工程文件dump成為ast文件,查看dump結(jié)果。我的開發(fā)習(xí)慣是,接到一個走查需求,一定dump對應(yīng)的目標(biāo)文件,形成思路后,再實(shí)現(xiàn)走查代碼。

clang -Xclang -ast-dump -fsyntax-only ./testOCLint/main.m

這樣就夠了?這么簡單,肯定是不行的,在實(shí)際開發(fā)中,是需要傳入各種各樣的編譯環(huán)境依賴的.如開發(fā)平臺上面的,arc等編譯控制項(xiàng)!


image.png

這樣一大段也是從Xcode build log中導(dǎo)出的,不是全部,自己參照著來獲取部分有用的 build log,這樣就能dump自己的業(yè)務(wù)文件了!


image.png

dump的AST語法圖譜:
image.png

簡單的調(diào)試,可以用oclint-kgclang-rules里面的debug.m,開發(fā)調(diào)試的。

后續(xù)

16年的時候就寫了若干插件,時間一久容易忘記,打算再寫若干篇文章,記錄怎么用AST,最終能盡情的編寫clang靜態(tài)代碼走查插件,也讓自己隨時翻閱!

喜歡的朋友幫忙點(diǎn)個贊?。。?/h2>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • oclint自定義規(guī)則的編寫,一般我們會生成xcode工程,然后進(jìn)行編碼,build之后會輸出dylib。如果我們...
    微微笑的蝸牛閱讀 2,734評論 2 53
  • OCLint工具介紹 OCLint是一個靜態(tài)代碼掃描分析工具,可用于提高代碼質(zhì)量和減少潛在的缺陷,目前支持C,C+...
    Lojii閱讀 6,247評論 5 5
  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫安裝 3、第三方服務(wù) 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,172評論 1 180
  • 今天媽媽和我說去年相親的對象馬上就要訂婚了。我毫不在意地應(yīng)了聲。那女孩我知道,是我初中的同學(xué),還是前桌。我毫不在意...
    魈七爺閱讀 343評論 0 0
  • 青青子衿,悠悠我思
    思無邪詩經(jīng)閱讀 234評論 0 0

友情鏈接更多精彩內(nèi)容