iOS 静态代码扫描

iOS 静态代码扫描(facebook 出品 infer)

前阵子 facebook开源了其静态代码扫描工具,该工具通吃 JAVA\Android\iOS,不仅可以检查 Android 和 Java 代码中的 NullPointException 和 资源泄露,也可以发现 iOS 和 C 代码中的内存泄露问题。据介绍,它能像人类一样查看代码,并作出一些推测。但它的优势是,数分钟就能看完上千行代码。Facebook已经用它修复了八成的漏洞。Infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度。

谁在使用 Infer? 
Infer 已经成为 Facebook 开发流程的一个环节,包括 Facebook Android 和 iOS 主客户端,Facebook Messenger, Instagram 在内的,以及其他影响亿万用户的手机应用,每次代码变更,都要经过 Infer 的检测。

本文介绍一下在MacOS X环境下安装 Infer 和如何在实际项目中应用这款静态扫描工具。

下载地址: 
https://github.com/facebook/infer

1. 前置条件

  • 安装 python 2.7 
    由于 MAC自带,此处不再赘述。
  • 安装 opam
brew install opam # Homebrew, OSX Mavericks or later

下载 opam

  • XCode <= 6.3, >= 6.1
  • clang (在XCode命令行工具中。 可通过以下命令安装 xcode-select --install)

2.安装指南

下载 infer

git clone https://github.com/facebook/infer.git

安装 OCaml :

opam init --comp=4.01.0  # (answer 'y' to the question)
eval `opam config env`
opam install sawja.1.5 atdgen.1.5.0 javalib.2.3 extlib.1.5.4

支持 JAVA\OC静态分析

cd infer #进入 infer的安装路径

./update-fcp.sh && ../facebook-clang-plugin/clang/setup.sh && ./compile-fcp.sh # 稍等片刻,喝杯咖啡吧 :)

make -C infer
export PATH=`pwd`/infer/bin:$PATH

3.例子

..infer-master/example下的示例来演示下如何使用 Infer进行静态代码扫描。 
infer 下的 示例程序

  • 单独检查某个文件时(Hello.m):
infer -- clang -c Hello.m
  • 检查完整项目时(ios_hello):
infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator

注意: 
只有将 infer设置为PATH环境变量时才可以直接执行上述命令,否则就需要在命令中指定 infer的安装路径,例如:

../infer/bin/infer -- clang -c Hello.m

Hello.m的源码如下:

#import <Foundation/Foundation.h>

@interface Hello: NSObject
@property NSString* s;
@end

@implementation Hello
NSString* m() {
    Hello* hello = nil;
    return hello->_s;
}
@end

通过静态扫描,我们可以看到其中有一处需要修改: 
Hello.m静态扫描结果
NSString 类型的变量 s 没有指定assign\retain\copy属性。

4.项目应用实战

下面以真实项目为例,介绍使用 infer的分析过程。 
首先,cd命令进入到项目所在路径,该路径下有项目启动文件XXX.xcodeproj,命令行中执行以下命令:

infer -- xcodebuild -target `XXX` -configuration Debug -sdk iphonesimulator

编译结束后,终端会显示静态扫描的结果: 
项目实战扫描结果

我们可以通过查看 warning,判断哪些代码需要优化。

5. 进阶

5.1 Top-level 命令

infer : 执行 Infer的主命令,用python写的脚本文件。 
inferTest : 执行 infer tests 的 shell 脚本。通过 Buck执行测试。 
inferTraceBugs : 在 infer 报告中聚类错误日志的 python脚本。

5.2 辅助命令

下面的这些在 infer/bin路径下的命令不是直接调用的,但是是被 上文的top-level命令所调用。

InferJava : 包含 java前端的二进制文件。

InferClang : 包含 clang前端的二进制文件。

InferAnalyze : 执行分析的 infer后端二进制文件。

InferPrint : 打印关于方法和 Bug 列表的分析报告的二进制文件。

inferJ : 执行分析 java文件的命令。

BuckAnalyze : 执行分析用 buck编译的 java项目的命令。

inferlib.py : 为其他脚本提供支持的python库。

utils.py : 为其他脚本提供支持的python库。

jwlib.py : 为其他脚本提供支持的python库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值