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. C++——多态性

    多态是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为: 多态的实现:函数重载:运算符重载:虚函数 为什么需要重载运算符? 在C++没有复数运算,进行复数运算之前我们要事先写一个复数类, ...

  2. C语言合并两个有序链表

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1->2-& ...

  3. VMware该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权

    原文链接:https://blog.csdn.net/helloxiaozhe/article/details/81176684 VMware该虚拟机似乎正在使用中.如果该虚拟机未在使用,请按“获取所 ...

  4. 2018护网杯easy_tornado(SSTI tornado render模板注入)

    考点:SSTI注入 原理: tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且 ...

  5. scrapy爬虫保存数据

    1.数据保存为TXT 打开Pipeline.py import codecs import os import json import pymysql class CoolscrapyPipeline ...

  6. AcWing 12. 背包问题求具体方案

    //f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]) #include <iostream> using namespace std; ; int n, ...

  7. pikaqiu练习平台(SQL注入 )

    sql注入漏洞 (危害是最大得) Sql注入 数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执 ...

  8. 无缘诺贝尔奖的George Dantzig——线性规划之父

    无缘诺贝尔奖的George Dantzig——线性规划之父 王军强,2012年11月2日 “线性规划之父”的George Dantzig,与“计算机之父”.“博弈论之父”John Von Neuman ...

  9. 根下var目录迁移

    问题 var目录挂载在根目录下,占用/分区的空间,如果/var/log日志空间过大,将导致/分区空间满,导致系统无法使用. 解决方案 在硬盘上划分单独的分区,挂载到/var目录,并迁移/var目录下的 ...

  10. 自动构建自己的ASP.NET Core基础镜像

    在开发过程中,我们可以根据自身情况来定制自己的基础镜像,以便加快CI\CD构建速度以及提高开发体验.这里我们就以ASP.NET Core的基础镜像为例来进行讲解. 本次教程代码见开源库:https:/ ...