Infer的官网:https://fbinfer.com/docs/getting-started
本文主要介绍Facebook公司的静态分析工具Infer的安装和基本使用。
infer支持C,Objective-C,Java等语言。
支持的bug类型可以在该链接处查询:https://fbinfer.com/docs/all-issue-types
安装
从该链接下载release包:https://github.com/facebook/infer/releases
然后解压后,输入以下命令软链接到系统的路径。
sudo ln -s "你的infer的路径" /usr/local/bin/infer
如果安装成功,输入help命令应该会显示相关信息。
infer --help
使用
在使用infer之前,确保测试的程序已经是clean过的状态。(执行make clean)
infer分析的流程主要有两步。
-
capture:将源码翻译为infer自己的中间层语言
-
analysis:分析中间层
infer默认是将翻译过来的中间语言存储在使用infer命令的那个目录下的infer-out/\
。如果要更换存储目录的名字,可以用-o选项。
infer run -o /tmp/out -- make
在分析步骤中,infer会在中间语言对每个函数进行分析。如果发现一个函数中的错误,他会停止分析该函数,但是其他函数还是会继续分析的。
报告的结果会存放在`infer-out/report.txt`中。
现在我们来实际测试libpng试试看看,
#在libpng的目录下
export LLVM_COMPILER=clang
./autogen.sh
./configure --disable-shared
# 如果是之前就make过的话,需要加上make clean的命令
# 运行infer
./infer run -- make
然后可以看到infer-out目录下的report.txt报告了26个issue。
#0
pngset.c:583: error: Dead Store
The value written to &max_palette_length (type int) is never used.
581. return;
582.
583. max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
^
584. (1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
585.
...
#25
png.c:4134: error: Null Dereference
pointer `table` last assigned on line 4126 could be null and is dereferenced at line 4134, column 10.
4132. else
4133. for (i=0; i<256; ++i)
4134. table[i] = (png_byte)(i & 0xff);
^
4135. }
4136.
Found 26 issues
Issue Type(ISSUED_TYPE_ID): #
Dead Store(DEAD_STORE): 14
Null Dereference(NULL_DEREFERENCE): 7
Uninitialized Value(UNINITIALIZED_VALUE): 4
Resource Leak(RESOURCE_LEAK): 1
同时,我们还可以看见infer-out目录下有以下文件
bugs.txt costs-report.json report.json results.db results.db-wal
config-impact-report.json logs report.txt results.db-shm tmp
可以看到提供了db和json格式的report。另外,bugs.txt中的内容是
The contents of this file have moved to report.txt.
对于一些错误,比如空指针解引用,还可以使用infer explore命令获取到bugs的trace。e.g.
infer explore --select 25 --html
上面的命令会把25号issue的bug trace打印出来。如果要打印全部的话,可以把25替换为all。html参数是将结果保存为html,默认是不加的。
遇到的问题
问题1:运行infer run — make时报错CRITICAL: No compiler set. Please set environment variable LLVM_COMPILER
输入以下命令即可解决:
export LLVM_COMPILER=clang