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./lib/infer/infer/bin/../lib/python/infer.py
-j --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
Error backtrace:
Raised at file "base/Die.ml" (inlined), line , characters -
Called from file "base/Logging.ml", line , characters -
Called from file "integration/Driver.ml", line , characters -
Called from file "integration/Driver.ml", line , characters -
Called from file "infer.ml", line , characters -
Called from file "infer.ml", line , characters -

  改成命令: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中释放该通知。项目中出现这种问题的类,基本都是单例,不会被销毁。





iOS开发之使用 infer静态代码扫描工具的更多相关文章

  1. 静态代码扫描工具PMD定制xml的规则(一)操作篇

    0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...

  2. Lint——Android SDK提供的静态代码扫描工具

    Lint和FindBugs一样,都是静态代码扫描工具,区别在于它是Android SDK提供的,会检查Android项目源文件的正确性.安全性.性能.可用性等潜在的bug并优化改进. 下图简单地描述了 ...

  3. 静态代码扫描工具使用教程 - SonarQube+SonarScanner

    预置条件: Jdk已安装 Mysql已安装 1. 下载 SonarQube和Sonar scanner. SonarQube: http://www.sonarqube.org/downloads/ ...

  4. 【Lua篇】静态代码扫描分析(一)初步介绍

    一.静态代码分析         静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段.通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问 ...

  5. 使用OClint进行iOS项目的静态代码扫描

    使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要 ...

  6. iOS开发 swift 3dTouch实现 附代码

    iOS开发 swift 3dTouch实现 附代码 一.What? 从iphone6s开始,苹果手机加入了3d touch技术,最简单的理解就是可以读取用户的点击屏幕力度大小,根据力度大小给予不同的反 ...

  7. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  8. java静态代码分析工具infer

    infer是一个静态代码分析工具,探测bugs. 主要支持Java.C/C++ 安装:brew install infer 在线展示:https://codeboard.io/projects/115 ...

  9. DEVOPS技术实践_05:sonar静态代码扫描

    一.SonarQube静态代码扫描平台 1.1 安装 https://www.sonarqube.org/官网 1.2 下载软件包 https://www.sonarqube.org/download ...

随机推荐

  1. Spring的代理模式(静态,JDK,CGLIB)

    一.静态代理   1.定义业务接口 public interface Subject { void doSomeThing(); }   2.真实业务类实现接口 public class RealSu ...

  2. 三行代码实现垂直居中和cube

    三行代码实现上下居中 position: relative;top: 50%;transform: translateY(-50%); 效果如下:   代码: <!DOCTYPE html> ...

  3. 《 Java 编程思想》CH07 复用类

    复用代码是 Java 众多引人注目的功能之一. Java 可以通过创建类来复用代码,要在使用类的时候不破坏现有代码,有两种方式: 组合:在新的类中使用现有类的对象. 继承:按照现有类的类型来创建新类, ...

  4. Qt中的Label和PushButton背景图自动缩放设置

    Label 背景图自动缩放 QPixmap* pixmap = new QPixmap(":/images/HeadIcon/1.png"); pixmap->scaled( ...

  5. Controller-->View传值的几种方法

    Controller --- > View 传值的方法 ViewBag ViewData TempData 向普通View页面传一个Model对象 向强类型页面传传一个Model对象 用一个Vi ...

  6. Tensorflow中one_hot() 函数用法

    官网默认定义如下: one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None) 该 ...

  7. 手机app测试要点(复制文)

    一.简介 移动应用App已经渗透到每个人的生活.娱乐.学习.工作当中,令人激动.兴奋且具有创造性的各种App犹如雨后春笋般交付到用户手中.各类智能终端也在快速发布,而开发者对于全球移动设备的质量和性能 ...

  8. SaltStack之return与job管理

    目录 1. SaltStack组件之return 1.1 return流程 1.2 使用mysql作为return存储方式 2. job cache 2.1 job cache流程 2.2 job管理 ...

  9. Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:1099

    方法:把catalina.bat 文件中set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m这行去掉,具体看下面两篇博客 https://blo ...

  10. FireFox浏览器的about:config参数大全及其具体用途介绍

    FireFox浏览器的about:config参数大全及其具体用途介绍,注意:这还远不是所有的about:config参数,由于设置参数太多,官方也只提供英文版本的说明,这里提供的FireFox ab ...