前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用facebook的infer检查Android代码缺陷

使用facebook的infer检查Android代码缺陷

作者头像
张云飞Vir
发布2020-03-16 16:27:07
1.7K0
发布2020-03-16 16:27:07
举报
文章被收录于专栏:写代码和思考写代码和思考

背景

Infer 是一个静态分析工具,它能在 Android 和 iOS 的编译过程中今夕代码分析,发现缺陷。使用起来也很简单方便。

什么是 Infer?

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

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

Infer 是一个静态程序分析工具,可以对 Java、C 和 Objective-C 程序进行分析,此工具是用 OCaml 写成的。

Infer 最早部署在 Facebook 内部,用于发布移动应用之前对每一行代码进行分析,目前 Facebook 使用此工具分析所开发的 Android、iOS 应用,包括 Facebook Messenger、Instagram 和其他一些应用。 Infer 不仅仅用于移动应用程序的分析,还可以分析 C、Java 等不是 Android 系统的代码。 目前 Infer 着重于发现一些诸如空指针的访问、资源和内存的泄露等导致手机程序崩溃或性能严重下降的问题。

官网地址:https://infer.liaohuqiu.net

开始使用

1.下载地址

https://github.com/facebook/infer/releases/

下载完成后时个压缩包,解压后放到磁盘某个位置,记下路径。

2.配置到环境变量

将上一步的路径(可执行文件所在的路径)配置到环境变量

代码语言:javascript
复制
  export PATH="PATH:xxxxxx/infer/infer/bin"

我的是mac系统,要修改~/.bash_profile 完成后在控制台执行 infer ,可能看到如下:

代码语言:javascript
复制
yunfeideMacBook-Pro:bin zhangyunfei$ infer --version
Infer version v0.15.0
Copyright 2009 - present Facebook. All Rights Reserved.

为了演示,准备一个错误的例子

以下是一个的 Java 例子,可以看到 s 是个空引用。

代码语言:javascript
复制
  // Hello.java
  class Hello {
    int test() {
      String s = null;
      return s.length();
    }
  }

3.执行缺陷检查,检查Android工程

代码语言:javascript
复制
infer -- ./gradlew build

这里执行了 gradle 的构建,不过它以 infer 开头的指令,在构建过程中 infer 会捕获并进行缺陷检查。

4.查看检查报告

image.png

可以看到上图中的红字部分了指示了可能的代码缺陷。

Infer 的工作机制

1. 捕获阶段

Infer 捕获编译命令,将文件翻译成 Infer 内部的中间语言。

这种翻译和编译类似,Infer 从编译过程获取信息,并进行翻译。这就是我们调用 Infer 时带上一个编译命令的原因了,比如: infer -- clang -c file.c, infer -- javac File.java。结果就是文件照常编译,同时被 Infer 翻译成中间语言,留作第二阶段处理。特别注意的就是,如果没有文件被编译,那么也没有任何文件会被分析。

Infer 把中间文件存储在结果文件夹中,一般来说,这个文件夹会在运行 infer 的目录下创建,命名是 infer-out/。当然,你也可以通过 -o 选项来自定义文件夹名字:

代码语言:javascript
复制
infer -o /tmp/out -- javac Test.java

2. 分析阶段

在分析阶段,Infer 分析 infer-out/ 下的所有文件。分析时,会单独分析每个方法和函数。

在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。

所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。

错误除了会显示在标准输出之外,还会输出到文件 infer-out/bug.txt 中,我们过滤这些问题,仅显示最有可能存在的。

在结果文件夹中(infer-out),同时还有一个 csv 文件 report.csv,这里包含了所有 Infer 产生的信息,包括:错误,警告和信息。

参考

官网地址:https://infer.liaohuqiu.net https://infer.liaohuqiu.net/docs/hello-world.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 什么是 Infer?
  • 开始使用
    • 1.下载地址
      • 2.配置到环境变量
        • 3.执行缺陷检查,检查Android工程
          • 4.查看检查报告
          • Infer 的工作机制
            • 1. 捕获阶段
              • 2. 分析阶段
              • 参考
              相关产品与服务
              文件存储
              文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档