infer官方文档:https://fbinfer.com/docs/getting-started.html
infer前世今生
首先infer是facebook开源的一款静态代码扫描工具,infer最早是一个叫Monoidics的初创公司的产品,最早只支持C语言的版本,后来被facebook收购了,由于Facebook有相当数量的c++、Javascript、php、objective-C和Java代码,但是纯C语言的开发较少,所以facebook根据自己的需求,不断完善出支持扫描Android和iPhone的静态扫描工具,也就有了后来对objective-C、C++,Java代码的扫描,最后得到了支持多种语言静态扫描功能的infer。
infer原理
首先,infer是基于分离逻辑(Separation logic)和Bi-abduction 来实现的。原理
那是什么是分离逻辑呢???
分离逻辑是霍尔逻辑的一种扩展.霍尔逻辑是广泛应用的程序验证逻辑系统,用于对命令式语言程序 进行推理验证.
基本思想是:在代码段及其调用者之间构建一种合同似的规格说明,由一个前置条件和一个后 置条件构成.前置条件是一个断言,描述这个代码段执行前程序状态必须满足的条件;后置条件也是一个断言, 描述在代码段正确运行后程序状态所需要满足的条件,调用者可以确信在代码段执行结束后这个状态条件 为真。
在分离逻辑中,前置条件和后置条件中的程序状态主要由栈S和堆H构成,栈是变量到值的映射,而堆是有限的地址集合到值的映射.在程序验证时,可以将栈看作对寄存器内容的描述,而堆是对可寻址内存内容的描述.
infer安装
可以看官方文档推荐的安装方式:https://fbinfer.com/docs/getting-started.html
如果你用的是mac,已经安装了homebrew,那么你可以使用一下命令安装:
brew install infer
infer命令使用
一共有两种方式:
第一种:这种方式需要多步,需要生成中间数据,然后对中间数据进行分析,最后得到infer扫描的结果。
xcodebuild | tee xcodebuild.log
xcpretty -r json-compilation-database -o compile_commands.json < xcodebuild.log > /dev/null
infer run --skip-analysis-in-path Pods --clang-compilation-db-files-escaped compile_commands.json
第二种:这种是直接使用xcodebuild,调用本地编译器,直接生成扫描结果。
infer run -- xcodebuild -target -configuration -sdk iphonesimulator
infer黑白名单配置
文档说明
在进行代码扫描的时候,会出现一个问题,就是把不需要扫描的文件或者第三方库的文件都扫描一遍,如果不想扫描这些文件怎么办呢,这就需要白名单和黑名单了。
infer的黑白名单设置,需要在扫描文件的路径下创建一个“.inferconfig”的隐藏文件,然后在文件中配置具体的黑白名单,官方说是可以支持正则表达式regex,我还没使用过,我直接用的路径配置,来进行配置的,白名单配置你需要扫描的文件路径,黑名单是不需要扫描的文件路径,这是一个安卓 bliud 工具Buck项目中的配置:
{
"checkers-whitelist-path-regex": [
"src",
"ideabuck"
],
"checkers-blacklist-path-regex": [
"src-gen"
],
"eradicate-whitelist-path-regex": [
"src",
"ideabuck"
],
"eradicate-blacklist-path-regex": [
"src/com/facebook/buck/junit",
"src-gen"
],
"infer-whitelist-path-regex": [
"src",
"ideabuck"
],
"infer-blacklist-path-regex": [
"src-gen"
]
}
infer扫描结果
infer扫描完成后,会在你扫描文件的路径中,多出一个名字叫做“infer-out”的文件夹,里面有多个文件,最主要的是bugs.txt和report.json,可以看出具体的问题,下面是我们项目的扫描结果bugs.txt的扫描结果:
/XXXDemoPath/XXXDemo.m:19: error: DEAD_STORE
The value written to &manager (type COCheckoutManager*) is never used.
17. - (NSArray *)showVMs
18. {
19. > XXX *manager = [XXX sharedManager];
20. if (!self.currentModel || !self.isInternational) {
21. return nil;
/XXXDemoPath/XXXDemoConfig.m:32: error: NULL_DEREFERENCE
pointer `attributes` last assigned on line 27 at line 32, column 24.
30.
31. for (int i = 0; i < count; i++) {
32. > property = attributes[i];
33. key = [NSString stringWithUTF8String:property_getName(property)];
34. value = [self valueForKey:key];
Summary of the reports
BAD_POINTER_COMPARISON: 17
DEAD_STORE: 20
NULL_DEREFERENCE: 7
USE_AFTER_LIFETIME: 4
POINTER_TO_INTEGRAL_IMPLICIT_CAST: 2
POINTER_TO_CONST_OBJC_CLASS: 2
RETAIN_CYCLE: 1
PREMATURE_NIL_TERMINATION_ARGUMENT: 1
从上面可以看出扫描出来的所有问题,以及每一种问题的类型,都有对应的字段,同时可以看问题代码的位置,方便修改。下面是infer规则问题类型汇总。
infer扫描结果版本对比
如果相对比两次infer扫描的结果,怎么办呢 ?
每次infer扫描,都会输出一个report.json的文件,可以利用这个文件对比,输出文件对比结果,需要使用infer的reportdiff命令,输出两次infer扫描的对比结果,命令如下:
infer reportdiff --report-current infer-out/report.json --report-previous report.json
使用上面命令,会在 infer-out中多出来一个文件夹differential,文件中有三个json文件分别为:
introduced.json:新增问题
fixed.json:新版本修复问题
preexisting.json:一直存在问题
infer规则问题类型汇总(主要总结的OC和C、C++)
Assign pointer warning assign修饰指针
Bad pointer comparison 错误的指针判断
C++ reference captured in Objective-C block block中有c++引用
Direct atomic property access 原子属性直接访问
Global variable initialized with function or method call 全局变量初始化调用函数,会有警告
Registered observer being deallocated 监听没有释放
Strong delegate warning delegate强引用
Unavailable api in supported ios sdk 无效的api
Pointer To const Objective-C Class const错误用法
Objective-C Weak Property has Custom Setter set方法属性弱引用
Checkers Immutable Cast 方法应该返回可变集合,返回了不可变集合。
Deadlock 死锁
Dead store 未使用的变量
Empty Vector Access 空Vector使用,C++
Field should be nullable
Fragment retains view
Interface not thread-safe 非线程安全
Ivar not null checked 变量非空检查
Memory leak 内存泄漏
Null dereference 空指针引用
Parameter not null checked 参数非空检查
Premature nil termination argument 提前nil终止
Resource leak 资源泄漏
Retain cycle 循环引用
Static initialization order fiasco 静态变量初始化 C++
Strict mode violation
Thread-safety violation
UI Thread Starvation
Unsafe_GuardedBy_Access
参考:
https://fbinfer.com/docs/getting-started.html](https://fbinfer.com/docs/getting-started.html
https://infer.liaohuqiu.net/
论文:基于分离逻辑的程序验证技术
https://research.fb.com/publications/moving-fast-with-software-verification/