美文网首页
工具-infer,静态代码检测

工具-infer,静态代码检测

作者: iYeso | 来源:发表于2019-03-12 16:46 被阅读0次

工具-infer,静态代码检测

1.工具介绍
2.环境要求
3.安装infer
4:使用
5:查看报告
6: 常见问题
7: infer检测的错误类型

一、工具介绍

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

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

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

二、环境要求

  • Python 2.7
  • opam (instructions here)
  • Java <= 1.7 (only needed for the Java analysis,Mac 纯净的安装了 OS X Yosemite 的话,其中是不会包含 Java 的,所以需要自己安装java)
  • Xcode <= 6.3, >= 6.1 (only needed for the C/Objective-C analysis)
  • clang in Xcode command line tools. You can install them with the command xcode-select --install (only needed for the C/Objective-C analysis)

1) 下载安装opam

    - 在安装`opam`前先安装`brew`,`brew`又叫`Homebrew`,是``上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令
    - 安装命令如下:`curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1`
    - 接着安装`opam`, `sudo brew install opam # Homebrew, OSX Mavericks or later`

2) 安装clang

    - xcode-select --install
  1. 配置opam
    - `opam init -y --comp=4.01.0`
    - `eval opam config env`
    - `opam install -y extlib.1.5.4 atdgen.1.6.0 javalib.2.3.1 sawja.1.5.1`

4)安装java

    - 打开终端输入:`java -version`
    - 如果当前系统还没有装过 Java 的话,会收到 `No Java runtime present, requesting install.` 的提示信息。然后还会弹出“您需要安装 JDK 才能使用’java‘ 命令行工具”的信息。
    - 点击“更多信息”就回进入 JDK[官方下载网站](http://www.oracle.com/technetwork/java/javase/downloads/index.html),之后就能在官网中下载到 Java 8 JRE 或者 Java 8 JKD。

三: 安装infer

3.1: 常规(不好用)
- `git clone https://github.com/facebook/infer.git`
- `cd infer`
- `git submodule update --init --recursive`
- `facebook-clang-plugins/clang/setup.sh `
- `./compile-fcp.sh`
- `make -C infer`
- `export PATH=`pwd`/infer/bin:$PATH`
3.2: 二进制文件安装(不好用)

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

tar xf infer-osx-vXX.tar.xz
# this assumes you use bash, adapt to your needs in case you use
# another shell
echo "export PATH=$PATH:`pwd`/infer-osx/infer/infer/bin" \
     >> ~/.bashrc && source ~/.bashrc
3.2: 源码安装

1: 安装 brew

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

2: 安装 Infer

brew install infer

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

3: 配置到环境变量

echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile

四: 使用

前提是确保命令行可以编译通过

xcodebuild -target <Target Name> \
-configuration <Build Configuration> \
-scheme <Schema Name>

TargetName, Build Configuration, SchemaName都可以通过

展示可以编译的项目

xcodebuild -list 

结果

$ xcodebuild -list

Information about project "WXQuestion":
    Targets:
        WXQuestion

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Debug" is used.

    Schemes:
        WXQuestion

可以查到支持的sdk

xcodebuild -showsdks
$ xcodebuild -showsdks
iOS SDKs:
    iOS 12.1                        -sdk iphoneos12.1

iOS Simulator SDKs:
    Simulator - iOS 12.1            -sdk iphonesimulator12.1

macOS SDKs:
    macOS 10.14                     -sdk macosx10.14

tvOS SDKs:
    tvOS 12.1                       -sdk appletvos12.1

tvOS Simulator SDKs:
    Simulator - tvOS 12.1           -sdk appletvsimulator12.1

watchOS SDKs:
    watchOS 5.1                     -sdk watchos5.1

watchOS Simulator SDKs:
    Simulator - watchOS 5.1         -sdk watchsimulator5.1

如果命令行可以编译通过, 只需要前面加上infer --就可以了

infer -- xcodebuild -target <Target Name> -configuration <Build Configuration> -scheme <Schema Name>

五:查看报告

结果会打印在终端的输出, 也可以通过`infer-out`路径下的文件来查看

六: 常见的问题

  • 工程的绝对路径中, 请不要含有中文字符, 否则会有类似报错
    File "/usr/local/Cellar/infer/0.8.1/libexec/infer/lib/python/inferlib/analyze.py", line 222, in run_command
    raise e
    
  • Infer needs a working compilation command to run infer运行后会发现类似如下的输出, 最后发现不了问题
    *** ERROR: Failed to execute compilation command. Output:
    

clang: error: cannot specify -o when generating multiple output files
*** Infer needs a working compilation command to run.
```

在github上可以发现很多人遇到了同样的问题, 主要原因是因为
issue的详情

七: infer检测的错误类型

  • 1: Java中捕捉的bug类型

    • Resource leak
    • Null dereference
  • 2: C/OC中捕捉的bug类型

    • Resource leak
    • Memory leak
    • Null dereference
    • Premature nil termination argument
  • 3: 只在 OC中捕捉的bug类型

    • Retain cycle
    • Parameter not null checked
    • Ivar not null checked

Resource leak
资源泄漏的问题在Java/C/OC都存在,资源代表文件,sockets,连接等等,使用后需要关闭。

Memory leak
内存泄漏的问题只在C/OC中报告

Retain cycle
内存死锁只存在OC中,A 创造B,B也创造了A,然后你等我,我等你,都无法释放

Null Dereference
Java/OC/C都会报告空引用的问题,当一个对象声明后,没有初始化,就被引用了,这个时候会报空指针错误。

Parameter not null checked
只在OC中报告,参数不能为空的检查,此类bug和空引用的错误是类似的,但是infer把这类问题单独出来了。

Ivar not null checked
本地变量不为空的检查

Premature nil termination argument
这类错误在C/OC中报告,有一些语句会在中途由于nil的出现造成了语句失败,比如:

NSArray *foo = [NSArray arrayWithObjects: @"aaa", str, @"bbb", nil];

如果str为nil,创建NSArray的字符串就失败了.

转自:https://infer.liaohuqiu.net/docs/getting-started.html
参考: Infer 在 Mac 上的安装和环境配置
使用 Infer 进行代码扫描

相关文章

网友评论

      本文标题:工具-infer,静态代码检测

      本文链接:https://www.haomeiwen.com/subject/tbpnpqtx.html