使用infer進行靜態(tài)分析總結(jié)

infer的安裝

  • 直接通過Homebrew進行安裝
brew install infer

使用infer過程中遇到的問題及解決方案

問題1

  • 問題描述
# 直接分析我這里沒有成功
infer run --skip-analysis-in-path Pods --no-xcpretty --keep-going -- xcodebuild -workspace xxxx.xcworkspace -scheme xxxx -configuration Debug -sdk iphoneos

# 使用上述分析命令會有編譯失敗的問題(已脫敏)
** BUILD FAILED **

The following build commands failed:
    這一段省略了...
(8 failures)
Internal Error:   /usr/local/Cellar/infer/0.17.0/lib/infer/infer/bin/../lib/python/infer.py
  -j 8 --project-root /Users/xxx/Desktop/Code/xxx-iOS/xxx --out
  /Users/xxx/Desktop/Code/xxx-iOS/xxx/infer-out -- xcodebuild
  -workspace xxx.xcworkspace -scheme xxx -configuration Debug -sdk
  iphoneos:
  exited with code 65
Error backtrace:
Raised at file "string.ml", line 145, characters 16-31
Called from file "string.ml" (inlined), line 149, characters 17-46
Called from file "src/string.ml", line 407, characters 12-33
Called from file "src/string.ml", line 416, characters 11-33
Re-raised at file "base/Die.ml", line 26, characters 8-56
Called from file "integration/Driver.ml", line 171, characters 2-16
Called from file "integration/Driver.ml", line 272, characters 6-409
Called from file "integration/Driver.ml", line 323, characters 2-29
Called from file "base/Utils.ml", line 398, characters 16-20
Called from file "scuba/ScubaLogging.ml", line 66, characters 29-44
Called from file "infer.ml", line 20, characters 2-36
Called from file "base/Utils.ml", line 398, characters 16-20
Called from file "scuba/ScubaLogging.ml", line 66, characters 29-44
Called from file "infer.ml", line 137, characters 8-54
  • 解決辦法:編譯數(shù)據(jù)生成compile_commands.json文件纵潦,再對生成的數(shù)據(jù)文件進行分析伴挚,官方文檔中也有說明The most robust way is to generate a compilation database, then pass that database to Infer,后面會給出完整命令酪我,繼續(xù)往下看

問題2

  • 問題描述
Error message:
clang-8: error: unknown argument: '-index-store-path'

*** Infer needs a working compilation command to run.
  • clang-8: error: unknown argument: '-index-store-path'錯誤
    • 分析:由于從Xcode 9.0開始將-index-store-path參數(shù)添加到構(gòu)建命令中。而infer所依賴的clang還不支持此參數(shù)且叁。在項目Build Setting中搜索index并將Enable Index-While-Building Functionality選項設(shè)置為NO
    • 主工程設(shè)置如下圖


      1.jpg
    • Pods工程設(shè)置如下圖


      2.jpg
  • Infer needs a working compilation command to run.錯誤
    • 解決方案:在分析命令中添加--no-xcpretty
  • 在分析過程中由于一些錯誤會中斷分析都哭,可以在分析命令中添加--keep-going參數(shù)來忽略這些錯誤,繼續(xù)分析

使用infer進行項目分析

  • 未使用Pods工程的項目比較簡單谴古,命令如下
infer run -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphoneos
  • 使用了Pods工程的項目
# 進入項目根目錄
cd projectRootMenu

# infer默認(rèn)是增量編譯质涛,只會分析變動的代碼,如果我們想整體編譯的話掰担,需要clean一下項目
xcodebuild clean
或者
xcodebuild -workspace xxx.xcworkspace -scheme xxx -sdk iphoneos clean

# 可以通過如下命令查看-sdk版本汇陆,如果使用iphoneos需要**檢查證書**
xcodebuild -showsdks

# 分析項目命令步驟如下
# 第1步:編譯工程生成編譯日志xcodebuild.log文件
xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration Debug -sdk iphoneos COMPILER_INDEX_STORE_ENABLE=NO | tee xcodebuild.log
# 第2步:根據(jù)編譯日志生成編譯數(shù)據(jù)compile_commands.json文件
xcpretty -r json-compilation-database -o compile_commands.json < xcodebuild.log > /dev/null
# 第3步:基于編譯數(shù)據(jù)compile_commands.json文件進行靜態(tài)分析
infer run --skip-analysis-in-path Pods --no-xcpretty --keep-going --compilation-database-escaped compile_commands.json

infer檢測的錯誤類型說明

  • RESOURCE_LEAK資源泄漏
    • 此問題在Java/C/OC都存在,資源代表文件带饱、sockets連接等毡代,使用后需要關(guān)閉
  • MEMORY_LEAK內(nèi)存泄漏
    • 項目代碼全面啟動了ARC進行內(nèi)存管理,在OC層沒有掃描出內(nèi)存泄露勺疼。目前掃描出的內(nèi)存泄露問題都是使用了malloc或者ralloc等c語言內(nèi)存申請函數(shù)教寂,在函數(shù)提前return前沒有及時free
  • Retain cycle內(nèi)存死鎖只存在OC中,A 創(chuàng)造B执庐,B也創(chuàng)造了A酪耕,然后你等我,我等你轨淌,都無法釋放
  • NULL_DEREFERENCE空指針的錯誤
    • 傳參為0的情況下迂烁。例如代碼中,在調(diào)用showAlertViewA()時递鹉,將tag傳參為0盟步,infer檢測此處傳0,判斷為一個NULL空指針躏结,所以爆出警告却盘。這里可以理解為誤報,不會出現(xiàn)問題。
    • 通過malloc黄橘、calloc兆览、realloc等函數(shù)申請內(nèi)存,當(dāng)內(nèi)存不足時旬陡,有可能會在該函數(shù)中返回NULL拓颓,如果沒有做NULL的判斷,則infer會警告
    • 在創(chuàng)建NSArray或者NSDictionary時描孟,傳入的參數(shù)有可能會nil驶睦。由于NSArray與NSDictionary不接受空指針,所以在對其addObject或者setObject:forKey: 時需要進行判斷一下是否為nil
    • 當(dāng)一個對象聲明后匿醒,沒有初始化场航,就被引用了,這個時候會報空指針錯誤廉羔。
  • ASSIGN_POINTER_WARNING
    • 由于在mrc時代溉痢,沒有weak指針,所以一些view的屬性聲明是__unsafe__unretain__的形式憋他,在arc中孩饼,這個屬性被判斷為assign,需要將其修改為weak或者strong
  • DIRECT_ATOMIC_PROPERTY_ACCESS
    • 在代碼中使用了使用了一個atomic的成員變量竹挡,infer建議我們將atomic修改為nonatomic镀娶。由于OC中,屬性會被默認(rèn)設(shè)置為atomic屬性揪罕,我們需要顯示將屬性聲明為nonatomic梯码。
  • IVAR_NOT_NULL_CHECKED
    • 在代碼中調(diào)用block,運行代碼時好啰,沒有做判空處理轩娶。即需要改動為,if(block){block()}
  • BAD_POINTER_COMPARISON
    • 沒有判斷一個NSNumber類型的對象是不是空框往?
  • TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
    • 代碼中使用了cookie的value鳄抒。可以理解為誤報
  • PARAMETER_NOT_NULL_CHECKED
    • 傳參時沒有判斷是否為null椰弊,加一次判斷就可以了
  • STRONG_DELEGATE_WARNING
    • 將一個delegate屬性設(shè)置為strong的類型嘁酿。
  • PREMATURE_NIL_TERMINATION_ARGUMENT
    • 沒有判斷是否為空
  • REGISTERED_OBSERVER_BEING_DEALLOCATED
    • 創(chuàng)建一個對象后,監(jiān)聽了某些通知男应,但是沒有在dealloc中釋放該通知。項目中出現(xiàn)這種問題的類娱仔,基本都是單例沐飘,不會被銷毀。
  • UNSAFE_CALL_TO_OPTIONAL_METHOD
    • This is a call to an @optional protocol method. Calling it without checking if its implemented
  • DEAD_STORE
    • 未使用的變量
  • UNINITIALIZED_VALUE
    • 值未初始化
  • POINTER_TO_CONST_OBJC_CLASS
    • const錯誤用法
  • RETAIN_CYCLE
    • 循環(huán)引用

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耐朴,隨后出現(xiàn)的幾起案子借卧,更是在濱河造成了極大的恐慌,老刑警劉巖筛峭,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐刘,死亡現(xiàn)場離奇詭異,居然都是意外死亡影晓,警方通過查閱死者的電腦和手機镰吵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挂签,“玉大人疤祭,你說我怎么就攤上這事《牛” “怎么了勺馆?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侨核。 經(jīng)常有香客問我草穆,道長,這世上最難降的妖魔是什么搓译? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任悲柱,我火速辦了婚禮,結(jié)果婚禮上侥衬,老公的妹妹穿的比我還像新娘诗祸。我一直安慰自己,他們只是感情好轴总,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布直颅。 她就那樣靜靜地躺著,像睡著了一般怀樟。 火紅的嫁衣襯著肌膚如雪功偿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天往堡,我揣著相機與錄音械荷,去河邊找鬼。 笑死虑灰,一個胖子當(dāng)著我的面吹牛吨瞎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穆咐,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼颤诀,長吁一口氣:“原來是場噩夢啊……” “哼字旭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崖叫,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遗淳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后心傀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屈暗,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年脂男,在試婚紗的時候發(fā)現(xiàn)自己被綠了养叛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡疆液,死狀恐怖一铅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堕油,我是刑警寧澤潘飘,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站掉缺,受9級特大地震影響卜录,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眶明,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一艰毒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搜囱,春花似錦丑瞧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扮宠,卻和暖如春西乖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坛增。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工获雕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人收捣。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓届案,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罢艾。 傳聞我的和親對象是個殘疾皇子楣颠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355