使用facebook infer寻找项目潜在BUG

来源:互联网 发布:java抽奖系统源代码 编辑:程序博客网 时间:2024/04/30 16:07

什么是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应用程序的Andr​​oid和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-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

看描述,error:MEMORY_LEAK,内存泄漏,在AppDelegate.m文件20行28个字符处,shadowPath通过调用CGPathCreateWithRect方法动态分配了内存。
然后我们看看实际的代码
-(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~}

后面还有很多日志可以自行查阅,那么我们接下来就修改一个bug,然后再次执行infer的检查,看是不是会解决这个问题呢。
我们来解决这个获取文件对象,却没有使用问题
-(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还有一系列的高级用法,有时间会慢慢写出来。

最后,转载请注明出处 : )

0 0
原创粉丝点击