Facebook開源Infer集成iOS代碼靜態(tài)分析
Homebrew安裝infer
brew install infer
設(shè)置環(huán)境變量
echo "export PATH=\"\$PATH:`pwd`/infer/infer/bin\"" \ >> ~/.bash_profile &&
source ~/.bash_profile
依賴組建
如果沒有回俐,請使用homebrew安裝
Python >= 2.7.
Xcodebuild
xcpretty
推斷檢測
?? 都需要cd到當(dāng)前文件/項目
單個文件
infer -- clang -c TTHello.m
單個項目
infer -- xcodebuild -target TTInfer -configuration Debug -sdk iphonesimulator
有pod工程
infer run -- xcodebuild -workspace TTInfer.xcworkspace -scheme TTInfer -configuration Debug -sdk iphonesimulator
編譯前清理
xcodebuild -target TTInfer -configuration Debug -sdk iphonesimulator clean
檢測成功運行之后赔桌,分析結(jié)果會被放入一個默認文件夾粱哼,infer-out:
infer-out
├── captured/
├── log/
├── multicore/
├── sources/
├── specs/
├── bugs.txt
├── procs.csv
├── report.csv
├── report.json
└── stats.json
1. captured/ 包含了 Infer 分析需要的每個文件的信息.
2. log/, multicore/, 和 sources/ 文件夾是分析器內(nèi)部驅(qū)動所需。
3. specs/ 包含了所分析的各個方法的 參數(shù)指標(biāo)牺弹,Infer 據(jù)此推斷文件湖笨。
4. bugs.txt, report.csv, 和 report.json 為三種不同格式的分析結(jié)果。
5. procs.csv and stats.json 包含 debug 信息的分析結(jié)果.
Infer 工作的流程
第一個階段是轉(zhuǎn)化階段捎谨,將源代碼轉(zhuǎn)成 Infer 內(nèi)部的中間語言。
類 C 語言使用 Clang 進行編譯隘击,Java 語言使用 javac 進行編譯,編譯的同時轉(zhuǎn)成中間語言研铆,輸出到 infer-out 目錄埋同。
第二個階段是分析階段,分析 infer-out 目錄下的文件棵红。分析每個方法凶赁,如果出現(xiàn)錯誤的話會繼續(xù)分析下一個方法,不會被中斷逆甜,但是會記錄下出錯的位置虱肄,最后將所有出錯的地方進行匯總輸出。
默認情況下交煞,每次運行 infer 命令都會刪除之前的 infer-out 文件夾咏窿。你可以通過 --incremental 參數(shù)使用增量模式。增量模式下素征,運行 infer 命令不會刪除 infer-out 文件夾集嵌,但是會利用這個文件夾進行 diff,減少分析量御毅。
一般進行全新一輪分析時直接使用默認的非增量模式根欧,而對于只想分析修改部分情況時,就使用增量模式端蛆。
使用心得
Infer 的效率高凤粗,支持增量分析,可小范圍分析今豆∠蛹穑可定制性不算最強柔袁,屬于中等,一些代碼習(xí)慣可能會被檢測出問題代碼亭罪,如:
NSString *name = @"";
name = nameArray.firstObject;
...
不過Infer 在準(zhǔn)確性瘦馍、性能效率、規(guī)則应役、擴展性情组、易用性整體度上的把握是做得最好的,值得推薦
分析結(jié)果
infer.png