iOS開發之使用 infer靜態代碼掃描工具


  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

    2、在官網下載安裝包進行安裝:  

    安裝成功之后,輸入 infer --version 來查看版本號:

    

  配置到環境變量: 

    echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile

  

  使用 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

    2、 MEMORY_LEAK:內存泄漏:
     項目代碼全面啟動了ARC進行內存管理,在OC層沒有掃描出內存泄露。目前掃描出的內存泄露問題都是使用了malloc或者ralloc等c語言內存申請函數,在函數提前return前沒有及時free
    3、 RESOURCE_LEAK:資源泄漏
    4、ASSIGN_POINTER_WARNING
      由於在mrc時代,沒有weak指針,所以一些view的屬性聲明是_、unsafe__unretain__的形式,在arc中,這個屬性被判斷為assign,需要將其修改為weak或者strong
    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中釋放該通知。項目中出現這種問題的類,基本都是單例,不會被銷毀。

 

 

 

 

 


免責聲明!

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



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