infer是Facebook 的 Infer 是一個靜態分析工具。可以分析 Objective-C, Java 或者 C 代碼,報告潛在的問題。
任何人都可以使用 infer 檢測應用,可以將嚴重的 bug 扼殺在發布之前,同時防止應用崩潰和性能低下。

infer 可以檢查 Java 和 Android 中的 NullPointException 和資源泄漏。
除了以上,infer 還可以檢測 iOS 和 C 代碼的內存泄漏!
應用范圍:
包括 Facebook Android 和 iOS 主客戶端,Facebook Messenger, Instagram 在內的,以及其他影響億萬用戶的手機應用,每次代碼變更,都要經過 Infer 的檢測。
infer 優點:
1、效率高、規模大,幾分鍾能掃描上千行代碼;
2、支持增量及非增量分析;
3、分解分析,輸出整合結果(infer能將代碼分解,小范圍分析后再將結果整合在一起,兼顧分 析的深度和速度) ;
在 iOS 和 C 中,infer 能捕捉的 bug 類型有:
1、資源泄漏;
2、內存泄漏;
3、null 引用;
4、Premature nil termination argument
只在 OC 中捕捉的 bug 類型有:
1、循環引用(Retain cycle);
2、參數非空檢查;
3、實例變量非空檢查;
Github 地址:https://github.com/facebook/infer
配置 infer 安裝:
1、homebrew 安裝:
brew install infer
如果安裝報錯,可根據提示信息更新 brew:brew update
安裝成功之后,輸入 infer --version 來查看版本號:

配置到環境變量:
echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \
使用 infer 工具進行代碼分析:
分析單個文件:
分析工程:
infer run -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphonesimulator
如果是 Pod 工程,執行:
infer run -- xcodebuild -workspace AVRecorder.xcworkspace -scheme AVRecorder -configuration Debug -sdk iphonesimulator
ps:被這個 infer run 命令給坑了,按照其他人博客上的命令:infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
出現錯誤:
** BUILD FAILED ** Internal Error: /usr/local/Cellar/infer/0.15.0/lib/infer/infer/bin/../lib/python/infer.py -j 8 --project-root /Users/zhangtibin/Downloads/infer-master/examples/ios_hello --out /Users/zhangtibin/Downloads/infer-master/examples/ios_hello/infer-out -- xcodebuild -project HelloWorldApp.xcodeproj -scheme HelloWorldApp -configuration Debug: exited with code 65 Error backtrace: Raised at file "base/Die.ml" (inlined), line 25, characters 6-36 Called from file "base/Logging.ml", line 314, characters 58-80 Called from file "integration/Driver.ml", line 159, characters 2-16 Called from file "integration/Driver.ml", line 280, characters 6-420 Called from file "infer.ml", line 20, characters 2-36 Called from file "infer.ml", line 130, characters 8-54
改成命令:infer run -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphonesimulator 后解決。

其他用法命令可參考:https://fbinfer.com/docs/analyzing-apps-or-projects.html#xcodebuild
如果出現:Nothing to compile. Try cleaning the build first.
可使用:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean,保證增量到非增量轉換。

添加靜態分析工具忽略文件:
在工程目錄下新建 .inferconfig 文件, 內容如圖, 可以過濾掉Pods文件夾下的第三方庫, skip-analysis-in-path是一個數組, 想要過濾其他文件, 只需要增加路徑即可

出現常見錯誤類型有:
1、NULL_DEREFERENCE:空指針的情況。
1.傳參為0的情況下。例如代碼中,在調用showAlertViewA()時,將tag傳參為0,infer檢測此處傳0,判斷為一個NULL空指針,所以爆出警告。這里可以理解為誤報,不會出現問題。
2.通過malloc,calloc,realloc等函數申請內存,當內存不足時,有可能會在該函數中返回NULL,如果沒有做NULL的判斷,則警告
3.在創建NSArray或者NSDictionary時,傳入的參數有可能會nil。由於NSArray與NSDictionary不接受空指針,所以在對其addObject或者setObject:forKey: 時需要進行判斷一下是否為nil
5、 DIRECT_ATOMIC_PROPERTY_ACCESS
在代碼中使用了使用了一個atomic的成員變量,infer建議我們將atomic修改為nonatomic。由於OC中,屬性會被默認設置為atomic屬性,我們需要顯示將屬性聲明為nonatomic。
6、IVAR_NOT_NULL_CHECKED
在代碼中調用block,運行代碼時,沒有做判空處理。即需要改動為,if(block){block()}
7、BAD_POINTER_COMPARISON
沒有判斷一個NSNumber類型的對象是不是空?
8、TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
代碼中使用了cookie的value。可以理解為誤報
9、PARAMETER_NOT_NULL_CHECKED
傳參時沒有判斷是否為null,加一次判斷就可以了
10、STRONG_DELEGATE_WARNING
將一個delegate屬性設置為strong的類型。
11、PREMATURE_NIL_TERMINATION_ARGUMENT
沒有判斷是否為空
12、REGISTERED_OBSERVER_BEING_DEALLOCATED
創建一個對象后,監聽了某些通知,但是沒有在dealloc中釋放該通知。項目中出現這種問題的類,基本都是單例,不會被銷毀。
