工具-infer,静态代码检测
工具-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
- 配置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 进行代码扫描