什么是Infer?
Facebook的infer是一个静态分析工具,如果你给定infer Objective-C,Java或C代码,它将分析潜在的bug列表。
任何人都可以使用infer拦截严重的安全漏洞,在应用上线之前有助于防止崩溃或性能不佳。
so
什么是静态分析呢?要知道我们调试bug的时候,都是运行逐行检查代码,而infer能在不运行程序的情况下进行代码分析,wow~有点AI的赶脚。
Infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度。
产品特点
Android和Java
报告空指针异常和资源泄漏。
iOS(本文以在Mac及IOS案例为主,android and java留坑慢填)
除以上之外,报告iOS和C代码的内存泄漏问题。
谁在使用infer?
它是用来作为Facebook发展过程中移动应用程序的一部分 - 其中包括主要的Facebook应用程序的Android和iOS,Facebook的messenger,Instagram,并且所使用的超过十亿用户的其他应用程序。
so
没事儿弄来玩一玩还是很不错的哈~(老板:(╯°□°)╯︵ ┻━┻ 给劳资写代码去!不然扣你KPI )
---------LET'S GO-----------------------------------
ok,接下来我们快速的做一个DEMO来初步运用infer这个强大的工具吧,嗯,因为要去买菜了所以有点赶哈(老板:(╯°□°)╯︵ ┻━┻ 上班你去买菜!!!!丢你个嗨!!!)
首先发布几个官方地址:
facebook infer官网(请自备梯子)
github地址(对下面的DEMO来讲没卵用,所以暂时不用download这个……)
--买菜先~-----------
------INSTALL-------
安装需要Python >=2.7版本,Mac自带了,good!
一、下载
紧接着,下载
- Mac OS X: https://github.com/facebook/infer/releases/download/v0.1.0/infer-osx-v0.1.0.tar.xz
- Linux: https://github.com/facebook/infer/releases/download/v0.1.0/infer-linux64-v0.1.0.tar.xz
或者从这里获取最新版本
二、解压
然后打开终端terminal,使用cd命令进入你下载的文件目录(你最好存在一个单独的目录中~)
如果你是Mac的话,运行以下命令解压(注意你下载的文件名、版本号,别只copy啊~)
tar xf infer-osx-v0.1.0.tar.xz
如果你是Linux的话,运行
以下命令解压(注意你下载的文件名、版本号,别只copy啊~)
tar xf infer-linux64-v0.1.0.tar.xz
注意你下载的文件名、版本号,别只copy啊~重要的话要重复三遍……
三、将包路径添加到环境变量当中
tips:因为要把路径添加到环境变量中,这里建议先把目录放到一个不常使用的地方,避免以后不注意(or不记得这是什么鬼)删掉了,那么这玩意儿也没法使用了;类似于android sdk~
执行以下命令(如果你这时候移动了目录的位置,记得重新cd到这个目录中,不要cd进解压的目录,不要cd进解压的目录,不要cd进解压的目录!!)
cd infer-*v0\.\1\.0 &&
echo "export PATH=\"\$PATH:`pwd`/infer/infer/bin\"" \ >> ~/.bash_profile &&
source ~/.bash_profile
这段命令包含了3个步骤,你看到有2个&&。
1、cd命令进入解压的文件(所以我上面不让你cd进去),如果出现No such file or directory了,那么可能版本号问题,改吧改吧就可以了,cd中的*符号是通配符,这里等价于osx-(linux64-),以至于Mac和linux都可以使用以上命令。
2、Mac自带的shell是bash,所以这里用echo将infer路径写入到.bash_profile文件中,弄过android sdk的都知道~
3、source是立即生效
执行完上面的命令后,只要不报错就成功了,在终端输入
infer -v
有返回版本号,则成功了
------GET START--------------------------
接下来使用官方提供的一个简单的栗子来使用infer,你可以在终端使用infer命令来获取错误反馈,并在修复后继续执行来查看结果。
接下来使用官方提供的一个简单的栗子来使用infer,你可以在终端使用infer命令来获取错误反馈,并在修复后继续执行来查看结果。
找到刚刚解压出来的文件夹,在infer-osx-v0.1.0/infer/examples目录,你会发现官方已经提供了几个栗子,good job~
看examples目录,你会发现有安卓项目、C语言文件、java类、oc类、IOS项目,没错啦,infer完全支持以上几种类型的BUG分析。
这里用ios_hello项目来进行演示。
首先用cd命令进入ios_hello目录,然后运行以下命令
infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
里面的HelloWorldApp是和你的项目名称是一样的
运行命令后你会看到大量的日志(不是BUG列表),然后查看ios_hello目录,会发现多了两个文件夹
build and infer-out
我还没研究build文件夹用来干嘛的,意思是编译的~
infer-out,则是输出文件里,bug列表就在里面了。
FB还是很厚道的,用了4种格式存放BUG列表,自己选择性使用吧。
然后让我们看看内容,打开bugs.txt,方便快捷,查看第一段
/Users/roy/Desktop/debug/infer-osx-v0.1.0/infer/examples/ios_hello/HelloWorldApp/AppDelegate.m:20: error: MEMORY_LEAK
memory dynamically allocated to shadowPath by call to CGPathCreateWithRect() at line 20, column 28 is not reachable after line 20, column 5
然后我们看看实际的代码
-(void) memory_leak_bug {
CGPathRef shadowPath = CGPathCreateWithRect(self.inputView.bounds, NULL);
}
soga!原因是没有使用shadowPath,一般xcode也会发出警告~
继续往下看(这里我把错误日志和代码放在一起)
/Users/roy/Desktop/debug/infer-osx-v0.1.0/infer/examples/ios_hello/HelloWorldApp/AppDelegate.m:25: error: RESOURCE_LEAK
resource acquired to fp by call to fopen() at line 25, column 8 is not released after line 25, column 5
--------------
-(void) resource_leak_bug {
FILE *fp;
fp=fopen("c:\\test.txt", "r"); //获取文件对象,却没有使用
}
/Users/roy/Desktop/debug/infer-osx-v0.1.0/infer/examples/ios_hello/HelloWorldApp/AppDelegate.m:29: warning: PARAMETER_NOT_NULL_CHECKED
Parameter callback is not checked for null, there could be a null pointer dereference: pointer callback could be null and is dereferenced at line 29, column 5
--------------------
-(void) parameter_not_null_checked_block_bug:(void (^)())callback {
callback(); //参数没有判断为nil,OMG~
}
我们来解决这个获取文件对象,却没有使用问题
-(void) resource_leak_bug {
FILE *fp;
fp=fopen("c:\\test.txt", "r");
fclose(fp); //这里加一个关掉
}
重新执行检查,
infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
然后再次打开bus.txt(得把旧的关掉重新打开),发现
/Users/roy/Desktop/debug/infer-osx-v0.1.0/infer/examples/ios_hello/HelloWorldApp/AppDelegate.m:25: error: RESOURCE_LEAK
resource acquired to fp by call to fopen() at line 25, column 8 is not released after line 25, column 5
已经不存在了,so good!!!
-----END---------------------
快速使用facebook infer的栗子就写到这里了,明天上班我会实际运用到正式项目当中,希望能有所收获。
另外infer还有一系列的高级用法,有时间会慢慢写出来。
最后,转载请注明出处 : )