infer 代碼靜態分析


infer 代碼靜態分析

 

靜態代碼分析工具,主要是為了提高我們的代碼質量。
通常,我們提高代碼質量的方式是通過CodeReview,但是這個過程耗費的人工和時間往往較大。並且隨着代碼量的增加人肉檢測起來會更加費勁。不要指望測試同學能把所有的問題都測試到,潛在問題就更別指望了。定制一些規則,讓機器幫我們完成一部分代碼質量的檢測,從而提高我們的工作效率。
 
 
都能檢測啥:
潛藏的問題:
循環引用,未使用的代碼,潛在的崩潰,命名規范等等
 
為優化決策提供依據:
圈復雜度:圈選復雜度指的是遍歷一個模塊時的復雜度,這個復雜度由if、switch、while、for循環,運算符&&||,以及決策點共同決定的,圈選復雜度在4以內低復雜度,5到7是中等復雜度,8到10是高復雜度,再往上就得考慮優化了。因為復雜度過高,可能需要更多的測試情況了。復雜度這個人工就不太好檢測了。
NSPath:
一個方法所有可能執行的路徑數量,執行路徑太多,那么業務邏輯可能就太復雜了,是否考慮優化?
NCSS度量:
NCSS度量指的是不包含注釋的代碼行數,如果檢測到多行代碼沒有注釋,這種的就不太有利於代碼的維護了
 
 
 
什么是Infer?
Infer是Facebook開源的靜態程序分析工具,用於在發布移動應用之前對代碼進行分析,找出潛在的問題。目前Facebook使用該工具來分析Facebook的App,包括Android、iOS、FacebookMessenger和Instagram等等。
 
官網:
https://fbinfer.com/
中文版:
https://infer.liaohuqiu.net/
 
Infer特性
1、支持Android和JavaInfer可檢查Android和Java代碼中的NullPointException和資源泄露。
2、支持iOS除了以上,Infer還可發現iOS和C代碼中的內存泄露。
3、效率高,規模大,幾分鍾能掃描數千行代碼;
4、支持增量及非增量分析
 
 
Infer工作流程
第一階段,轉化階段:將源代碼轉成Infer內部的中間語言。類C語言使用Clang進行編譯,java語言使用javac進行編譯。編譯的同時轉成中間語言,輸出到infer-out目錄。
第二階段,分析階段分析infer-out目錄下的文件,分析每個方法,如果出現錯誤會繼續分析下一個方法,中間不會中斷,但是會記錄下出錯的位置,最終將所有的錯誤進行匯總輸出。•Infer檢測的結果在infer-out目錄下是JSON格式,叫report.json

 

 

Infer安裝
環境要求,Python版本:大於等於2.7
•第一種:二進制文件安裝從https://github.com/facebook/infer/releases頁面獲取最新版本infer-osx-vXX.tar.xz (以osx標識),安裝。
open ~/.bash_profile
添加

export PATH="${PATH}:/'pwd'/infer-osx-v0.1.0/infer/infer/bin"

保存

source ~/.bash_profile

 
 
第二種:源碼安裝
1.1安裝brew  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
1.2安裝inferbrew install infer 安裝達到100%后可通過`infer –version`查看infer版本信息1.3配置到環境變量
echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile
 
 
 
 
 
 
Infer進行檢測
以下以iOS項目為例
1.cd  到項目目錄下面
cd  ........
2.clean 項目
3.開始檢測
infer --keep-going --no-xcpretty -- xcodebuild -workspace
CodeDetectionDemo.xcworkspace -scheme CodeDetectionDemo -configuration Debug -
sdk iphonesimulator
 
或者
 

infer --keep-going --no-xcpretty -- xcodebuild -project CodeDetectionDemo.xcodeproj -config Debug -target CodeDetectionDemo

注意事項:項目路徑中出現中文會導致檢測失敗
 
 
 
檢測結果
成功,有錯誤和修改完成之后

 

 

 

 

 

 

 

Infer增量及非增量
在第一次運行的時候,兩種模式是一樣的,都會對工程的所有文件進行編譯檢查,產生檢查結果:
增量模式:當已經產生分析結果后(build和infer-out文件夾),再執行編譯命令,即為增量模式。如有代碼沒有改動,則此次不會有編譯結果產生,如果代碼有新的改動,此次只產生新的編譯結果。這種以增量為基准的原則叫做增量模式。
 
非增量模式:在刪除了某個文件的情況下,運行文件,會輸出所有的編譯信息,即此時處於非增量模式。
 
如果每次都想檢測全部的代碼:<增量模式----->>非增量>
 
1、刪除文件
2、檢測之前,刷新一下項目
xcodebuild clean -workspace CodeDetectionDemo.xcworkspace -scheme CodeDetectionDemo
-configuration Debug -sdk iphonesimulator12.1

或者

xcodebuild clean

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM