infer学习篇

安装

依赖Python >= 2.7
使用brew进行安装brew install infer
配置环境变量

vim ~./bash_profile
export PATH=${PATH}:/usr/local/Cellar/infer

扫描项目

  • 扫描android 项目
    扫描命令infer -- ./gradlew build

如果代码有问题会输出一系列的问题,如果你没有改变任何文件,运行 Infer 进行检测,并没有进行分析。
这时因为 gradle 是增量的编译的。所有已经编译过的文件没有变动的文件将不会再编译。Infer 根据编译命令获取需要分析的文件,因此,这样的情况下,获取不到任何需要编译分析和分析的文件。
解决方法:
方法1:在两次分析之间运行 ./gradlew clean
方法2:在增量模式下运行infer: infer --incremental -- ./gradlew build

  • 扫描ios项目
    扫描命令:infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
    和gradle 相似,需要使用 --incremental (或 -i) 使得增量编译有结果输出。
    方法1:在两次分析之间运行 xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean
    方法2:在增量模式下运行infer: infer --incremental -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator

infer运行的两个阶段

  • 1、捕获阶段
    infer捕获编译命令,将文件翻译成infer内部的中间语言,infer从编译过程中获取信息,并进行翻译,这就是调用infer时带上一个编译命令。(infer将编译的语言翻译成自己的中间语言),infer把这个中间语言放在文件夹中,这个文件夹在文件目录下创建,命名是infer-out/
  • 2、分析阶段
    在分析阶段,Infer 分析 infer-out/ 下的所有文件。分析时,会单独分析每个方法和函数。
    在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。
    所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。
    错误除了会显示在标准输出之外,还会输出到文件 infer-out/bug.txt 中,我们过滤这些问题,仅显示最有可能存在的。
    在结果文件夹中(infer-out),同时还有一个 csv 文件 report.csv,这里包含了所有 Infer 产生的信息,包括:错误,警告和信息。

增量模式和非增量模式

运行时,infer会默认删除之前产生的infer-out/文件,这会导致非增量模式
如果需要增量模式,加入–incremental(或者 -i)参数运行,这样infer-out/文件夹将不会被删除

  • 增量模式
    infer目前支持的编译系统,对于某个特定系统可以使用infer --help – 了解具体信息

Gradle

infer -- gradle <gradle task, e.g. "build">
infer -- ./gradlew <gradle task, e.g. "build">

Buck

infer -- buck <buck target>

Maven

infer -- mvn <maven target>

Xcodebuild
Infer 可是分析使用 xcodebuild 构建的应用,但是只分析 .m 和 .c 文件,其他的文件,比如:.cpp,.cc,.mm 文件会被忽略。

infer -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphonesimulator
  • 非增量模式

非增量模式适用于单编译命令,重复运行infer检测的情况
如果需要全新一轮的分析,必须
1、删除结果文件夹

 rm -fr infer-out

2、删除构建产物

gradlew clean
  • 查看报告的详细信息
infer -- xcodebuild -target <target name> -configuration <build configuration> -sdk 

iphonesimulator

分析结果

分析结果会被保存在默认的文件夹中infer-out/

infer-out
├── captured/
├── log/
├── multicore/
├── sources/
├── specs/
├── bugs.txt
├── procs.csv
├── report.csv
├── report.json
└── stats.json
  • captured/ 包含了 Infer 分析需要的每个文件的信息.
  • log/, multicore/, 和 sources/文件夹是分析器内部驱动所需。
  • specs/ 包含了所分析的各个方法的 参数指标,Infer 据此推断文件。
  • bugs.txt, report.csv, 和 report.json 为三种不同格式的分析结果。
  • procs.csv and stats.json 包含debug 信息的分析结果。

捕获文件夹:

每个被捕获进行分析的文件在 infer-out/captured 下都有一个对应的文件夹。比如有一个文件名为 example.c,那么便会有一个文件夹 infer-out/captured/example.c/:

example.c.cfg
example.c.cg
example.c.tenv
.cfg, .cg 和 .tenv 后缀的文件包含了所分析文件的中间表示,这些数据传送给 Infer 的后端程序进行分析。 这些文件包含了序列化后的 OCaml 数据结构。.cfg 文件包含了代码文件中每个函数或方法的控制流程。.cg 包含了代码文件中定义的函数的调用关系,以及该文件对外部函数的调用关系。 .tenv 包含了代码文件中定义和用到的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值