所有者:facebook

使用场景: 在发布前检测 iOS 和 Android 应用的问题

About Infer

Infer 是一个静态分析工具。Infer 可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。

任何人都可以使用 Infer 检测应用,这可以将那些严重的 bug 扼杀在发布之前,同时防止应用崩溃和性能低下。

infer分析图

Infer特性

Android 和 Java

Infer 可检查 Android 和 Java 代码中的 NullPointException 和 资源泄露。

iOS

除了以上,Infer 还可发现 iOS 和 C 代码中的内存泄露,内存泄露,内存泄露。

Infer适用范围

包括 Facebook Android 和 iOS 主客户端,Facebook Messenger, Instagram 在内的,以及其他影响亿万用户的手机应用,每次代码变更,都要经过 Infer 的检测。

Infer优点

1:效率高,规模大,几分钟能扫描数千行代码;

2:支持增量及非增量分析(后边会解释)

3:分解分析,整合输出结果。(infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度)

Infer捕捉的bug类型

C/OC中捕捉的bug类型

1:Resource leak

2:Memory leak

3:Null dereference

4:Premature nil termination argument

只在 OC中捕捉的bug类型

1:Retain cycle

2:Parameter not null checked

3:Ivar not null checked

Infer安装

Infer为Linux和MacOS系统提供了预构建的二进制文件,如果你只是想使用Infer,而不想为该项目贡献代码的话,这些二进制文件足够了.相反,如果你想编译infer,请选择源码安装。此文档以Mac系统,源文件安装为栗子。

环境要求

Python版本:大于等于2.7

第一种:二进制文件安装

从infer release页面获取最新版本infer-osx-vXX.tar.xz (以osx标识),然后执行下面命令来安装Infer.

第二种:源码安装

借助brew安装

1.1安装brew/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

1.2安装inferbrew install infer

安装达到100% 后可通过`infer --version`查看infer版本信息

1.3配置到环境变量

cd 你的代码文件路径//建议放到一个不常改动的位置哦)echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile

执行完如上操作,如果没报错你就成功啦!

Git克隆+clang

(网速特别慢就不推荐了,因为俩步操作都很耗时)

2.1远程克隆git clone https://github.com/facebook/infer.git

2.2插件安装

注意:如果要分析C和Objective-C,Infer还需要clang以及facebook-clang-plugin插件。 facebook-clang-plugin插件见:facebook-clang-plugin如果只想分析Java/Android代码,那么无需以上的依赖库

Infer 的使用

目前infer支持的编译器有如下几种:

infer能分析的文件类型

在github上下载demo,demo下examples目录里,你会发现有android项目、C语言文件、java类、oc类、iOS项目,没错啦,infer完全支持以上几种类型的BUG分析。这里我们用ios_hello项目来做栗子:

首先用cd命令进入ios_hello目录,然后运行以下命令进行编译infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator

注意: 其中HelloWorldApp是你的项目名称

编译结果

1: 在项目所在目录下多出build和infer-out文件夹

编译后

build文件夹:捕获阶段: Infer 捕获编译命令(上面介绍的编译器命令),将文件翻译成 Infer 内部的中间语言。运行环境和设备信息也有所体现。

infer-out文件夹:分析阶段产生的文件,Infer将分析bugs结果输出到不同格式文件中,如csv、txt、json 方便对分析结果进行加工分析。

2: 运行后在终端会看到大量日志信息(同infer-out文件,可以以多种形式查看log信息)

代码分析

cc

错误总结

注意事项总结

1:在俩次执行编译命令的过程中,发现在没有对代码做任何更改的时候,报出BUILD SUCCEEDED的提示:我懵了!

我懵了

根据提示可以看到,此次build并没有分析任何文件。原因就是上面所提到的增量分析。

增量模式和非增量模式在第一次运行的时候,两种模式是一样的,都会对工程的所有文件进行编译检查,产生检查结果:

增量模式:当已经产生分析结果后(build和infer-out文件夹),再执行编译命令,即为增量模式。如有代码没有改动,则此次不会有编译结果产生,如果代码有新的改动,此次只产生新的编译结果。这种以增量为基准的原则叫做增量模式。

非增量模式:在删除了俩个文件夹的情况下,运行文件,会输出所有的编译信息,即此时处于非增量模式。

增量模式和非增量模式的转化

1:简单粗暴的做法是删除文件夹,即增量->非增量

2:科学的做法是这样的:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean,以保证增量->非增量状态

but...项目中我们更常用到的方式是修改单个文件,然后检测。 比如我检测出了这样的问题:

查到bug

然后我去代码修正了这个问题:

修改代码

执行:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean

然后看终端,问题就修复了。

2:如果编译过程出现‘AttributeError: 'NoneType' object has no attribute 'encode'’

encode错误

解决办法:1,pwd查看你当前目录,应该在工程所在目录下,而不是图上用户目录。

2,猴塞雷,请关注你的额代码,可能有错误。

infer的用法_infer使用的浅谈简析相关推荐

  1. float在html语言中的用法,[html5入门-4]浅谈html5中float的用法

    html5的文档布局方式一般有流式布局,浮动布局,固定布局和弹性布局等几种方式,本文主要浅谈一下浮动布局在html5中的用法. 一.float定义 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框 ...

  2. infer的用法_infer是什么意思|infer的音标|infer的用法 - 英语词典

    infer的意思.解释 过去式:inferred;   过去分词:inferred; 现在分词:inferring; infer 基本解释 及物动词推断; 猜想,推理; 暗示; 意指 不及物动词作出推 ...

  3. infer的用法_infer是什么意思_infer的翻译_音标_读音_用法_例句_爱词霸在线词典

    全部 四级 六级 高考 考研 We can infer from the passage that strong family and community ties can contribute to ...

  4. 计算机在气象上的应用浅论,简析计算机网络在气象服务中的应用原稿

    <简析计算机网络在气象服务中的应用(原稿).doc>由会员分享,可免费在线阅读全文,更多与<简析计算机网络在气象服务中的应用(原稿)>相关文档资源请在帮帮文库(www.woc8 ...

  5. 浅谈Linux中ldconfig和ldd的用法

    ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...

  6. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  7. php字面量,浅谈js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...

  8. 浅谈verilog hdl中parameter的用法

    浅谈verilog hdl中parameter的用法 parameter 1.parameter参数使用 事例1: 事例2: 事例3 事例4 2.defparam使用 事例5 3.parameter与 ...

  9. css inport作用,浅谈css和@import区别及用法详解

    下面小编就为大家带来一篇浅谈css和@import区别及用法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 css和@import都是调用外部样式表的方法. 一.用法 ...

  10. 浅谈C++中memset函数的用法

    浅谈C++中memset函数的用法 memset函数的头文件是cstring, 实际上是一个字符串处理函数,但常用于给静态数组(不是new出来的数组)赋特定初值. #include<cstrin ...

最新文章

  1. Linux Kernel5.10的核间通信(SGI中断)的本质
  2. SAP OData 服务在 gateway 层出错,应该如何处理?通过一个错误消息 Query XXX is invalid or contains errors 来举例说明
  3. android 解析错误 真机,AndroidStudio使用真机调试时出的一些bug
  4. Java 算法 礼物分配
  5. 中国甜叶菊乳制品市场趋势报告、技术动态创新及市场预测
  6. 【Hive】Hive的三种交互方式
  7. 【Python-3.5】绘制随机漫步图
  8. python 3教程_Python 3 教程
  9. asp.net web.config配置节说明
  10. Android 和iOS 比较
  11. 毕业三年,同学基本都辞职了,大部分人看完很有同感~
  12. php提交form表单提交方式,php form表单的提交
  13. lob移表空间 oracle_关于oracle带lob对象的分区表,移动表空间的问题
  14. 二进制转换成格雷码的方式
  15. Android 时区中英文显示对照
  16. 国产FPGA芯片资源性能对照比较一览表
  17. 带宽,线速以及吞吐量的概念
  18. linux内核5万行代码,[图]AMD为Linux内核贡献27.5万行代码 确认Van Gogh APU支持DDR5和VCN3...
  19. 基于Jetson AGX Xavier GMSL9296硬件设计与软硬件调试
  20. Fireeye前副总裁卜峥 :不知攻焉知防,打造“3C的安全体系结构”

热门文章

  1. windows子系统激活root权限
  2. 1.17英文题面翻译
  3. 成绩造假!你看到400+大佬,有可能是P图!
  4. javaScript 关于console的理解
  5. bootstrap-select 的多选+模糊查询下拉框详解(官方示例文档解读)
  6. 用Python做一个久坐提醒小助手
  7. php设计网站课程报告,在线课程网站设计与实现-开题报告
  8. 【Swift】SpotLight搜索
  9. matlab floor函数用法,matlab中fix, floor, ceil, round 函数的使用方法
  10. 宇宙中最恐怖的行星之索伦之眼—北落师门b