iOS 静态代码扫描之工具调研

作者:黄雪兰 团队:腾讯移动品质中心TMQ

为了进一步加强测试质量,同时探索测试左移在同步中的实践,iOS同步助手尝试接入静态代码扫描工具。希望通过不同的途径提前发现日常测试中难发现的问题。

然而iOS静态代码扫描工具有不少,它们都有什么不同?我应该选哪一个?因此,本文主要针对主流的几个工具,对同步助手的代码进行扫描,并分析对比它们的扫描结果,再敲定后续的接入计划。

该文章从以下几部分进行阐述,可按需阅读:

一、工具介绍

二、遇到的坑点

三、扫描能力对比

四、部分结果分析

一、工具介绍

本次选取了四个主流的扫描工具: coverity、infer、clang、oclint。

1、coverity

Coverity是检测和解决C、C++、Java和C#源代码中最严重的缺陷的领先的自动化方法。它将基于布尔可满足性验证技术应用于源代码分析引擎,分析引擎利用其专利的软件DNA图谱技术和meta-compilation技术,综合分析源代码、编译构建系统和操作系统等可能使软件产生的缺陷。

2、clang

Clang作为LLVM编译器框架的前端,最主要的任务是词法分析、语法分析,中间代码生成。源代码通过clang语法分析后,生成了语法分析树(AST)后,可作为静态分析工具对AST进行分析。

Clang命令行调用方法:

(1)下载clang:http://clang-analyzer.llvm.org/

(2)命令行cd到项目代码所在目录:$ cd /path

(3)使用clang扫描,命令开头为clang的scan-build所在目录:$ /Users/kylinhuang/Documents/tools/analyzer/bin/scan-build -vxcodebuild -target QQPimPro -configuration Developer

(4)可以看到生成报告在指定目录下

3、infer

Infer是Facebook开源的用来执行增量分析的一款静态分析工具,由OCaml语言编写的infer目前能检测出空指针访问、资源泄露以及内存泄露,可对C、Java和Objective-C代码进行检测。

Infer命令行调用方法:

(1)前置条件

安装python 2.7:MAC自带;

安装opam:$ brew install opam;

安装xcode;

(2)下载infer:https://github.com/facebook/infer

(3)安装 ocaml

$opam init --comp=4.01.0

$eval opam config env

$opam install sawja.1.5 atdgen.1.5.0 javalib.2.3 extlib.1.5.4

(4)将infer的执行目录配置到环境变量

命令行cd到infer所在目录:$ cd /infer-master

$echo "export PATH=\"\$PATH:pwd/infer-master/infer/bin\""\ >> ~/.bash_profile && source ~/.bash_profile

(5) 验证是否安装成功:$ infer -version

(6)使用infer扫描

命令行cd到项目代码所在目录:$ cd /path

infer-- xcodebuild -target QQPimPro -configuration Developer

(7)项目代码所在目录下生成结果文件夹infer-out:report.csv、report.json

4、oclint

Oclint是针对C、C++和Objective C代码的静态扫描分析工具,可以和xcode、xcodebuild、xctool等集成,使用命令行方式生成分析报告。这里主要使用oclint对xcodebuild产生的log进行分析,获取相关数据以后生成html文件。

Oclint命令行调用方法:

(1)下载oclint:https://github.com/oclint/oclint/releases

(2)配置环境变量,将oclint的bin目录添加到/etc/bashrc文件中:exportPATH=$PATH:/Users/kylinhuang/Documents/tools/oclint-0.11.1/bin

(3)验证是否安装成功:$ oclint

(4)命令行cd到项目代码所在目录:$ cd /path

(5)进行xcodebuild clean:$ xcodebuild clean

(6)xcodebuild与oclint结合,将xcodebuild analyze的输出信息记录在xcodebuild.log中,并使用xcpretty生成json文件:

$xcodebuild analyze | tee xcodebuild.log | xcpretty --reportjson-compilation-database

(7)xcpretty生成的json文件在/代码目录/build/reports下,名字为compilation_db.json,和oclint默认生成的文件命名和路径均不同,因此需要移至代码根目录并重命名为compile_commands.json。

(8)生成html文件

$oclint-json-compilation-database -- -o=report.html

二、遇到的坑点

1、缺少证书问题

Build代码的时候可能会遇到缺少了部分证书的问题,因此命令行调用时使用了developer模式,可忽略部分证书问题;

2、xcpretty安装

Infer在扫描过程中提示出错,需要安装xcpretty。但由于公司网络问题,按照网上教程使用gem install xcpretty安装时会出错。这里可以采用离线安装的方法:下载xcpretty.gem文件,并下载对应依赖版本的rouge.gem文件,离线文件下载地址:https://rubygems.org/

命令行打开离线文件所在目录:$ cd/Users/kylinhuang/Documents/tools

安装rouge.gem:$ sudo gem install rouge-1.8.0.gem

安装xcpretty.gem:$ sudo gem install --local xcpretty-0.2.4.gem

查看xcpretty.gem是否安装成功:$ xcpretty –v

3、infer增量分析

Infer为增量分析工具,通常默认只有修改过并提交编译的文件才会被infer分析。如果想要全量分析,可以调用前先清除扫描记录:

$ rm -rf /tmp/scan-build

$ rm -rf build

4、oclint:Skipping [path] Compile command notfound

使用oclint执行最后一步生成.html文件时出现该错误,最后排查到是开始没有clean xcodebuild,因此在进行扫描之前先执行这一步。

三、扫描能力对比

在未加任何过滤规则的情况下,四个工具对同一份代码进行扫描,并于开发童鞋一起对扫描结果进行了初步筛选和整理:

(1)准确率:coverity > infer >clang > oclint;

(2)coverity扫描维度更多、发现问题更精准;infer、clang能发现部分coverity未发现的问题,但误报率较高,可作为补充扫描;

(3)infer发现的大部分问题为第三方库问题,后续加入过滤计划可提高扫描准确率;

(4)oclint扫描出的问题数量最多,但大多是开发不关注的问题,可过滤特定结果类型关注,更适合作为扫描代码复杂度的工具。

四、部分结果分析

1、缺陷类

(1)无法执行到的代码

(2)if和else分支的代码一样

(3)废弃代码

已经走到return,后面的代码不会再执行:

2、误报类

(1)复制粘贴错误

代码中存在"com.xxx.unname",没有问题;

(2)switch中缺少break

开发故意设计如此,没有问题:

(3)没有判断是否为空

提示844行传传入的actionButton可能为空,但实际前面已赋值,且排查没有问题:

(4)未使用的值

提示cacheSuccess不会被使用,实际是在打印日志时使用了,而扫描时日志为关闭状态,没有走到下面的路径:

获取更多测试干货,请搜索微信公众号:腾讯移动品质中心TMQ!

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑白安全

Cyber​​Ark 企业密码保险库现高危远程代码执行漏洞

据外媒 4 月 9 日消息,德国网络安全公司 RedTeam Pentesting GmbH 发现 CyberArk Enterprise Password V...

411
来自专栏bdcn

CoreOS那些事之Rkt容器尝鲜(下) 转

2015年是各种容器技术与名词扎堆的一年,Docker的出现使得“应用容器”的实施变得易如反掌的同时,也带动了它的许多竞争者。其中一个比较有趣的看点就在于“容器...

912
来自专栏北京马哥教育

请注意!Zabbix高危SQL注入漏洞分析

? 0x01 漏洞概述 zabbix是一个开源的企业级性能监控解决方案。近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL...

2937
来自专栏程序员互动联盟

计算机的启动过程(详细)

对于使用电脑用户来说,打开电源启动电脑几乎是每天必做的事情,但计算机在显示这些启动画面的时候都在做什么呢?大多数用户都未必清楚。 下面就向大家介绍一下从打开电源...

2605
来自专栏数据和云

我明明 immediate 关库的,怎么就打不开了?!

五一放假期间,某客户的数据库出现故障,据说对方找了一些工程师折腾了一天,都无法将数据库open,其中参考了网络上的很多文章,也使用了一系列隐含参数,均无法将数据...

3485
来自专栏雪胖纸的玩蛇日常

Vue+Django2.0 REST framework打造前后端分离的生鲜电商项目(一、二)课程导学及开发环境搭建

2063
来自专栏阮一峰的网络日志

SSL/TLS协议运行机制的概述

互联网的通信安全,建立在SSL/TLS协议之上。 本文简要介绍SSL/TLS协议的运行机制。文章的重点是设计思想和运行过程,不涉及具体的实现细节。如果想了解这方...

3379
来自专栏翻译

Universe入门

Universe是一个用于衡量和训练AI的软件平台,适合世界上的所有游戏,网站和应用程序。本项目是一个universe开源库,它为 每个Universe环境提供...

4066
来自专栏逢魔安全实验室

就是这么简单,价值2W刀的Google存储型XSS和SSRF

? 01 — 前言 今天看到一篇文章《Stored XSS, and SSRF in Google using the DatasetPublishing L...

34211
来自专栏木宛城主

SharePoint 2010、2013多个域之间互信(Domain Trust)的设计与实施

在现实的业务场景中,有时为了更好的管理域用户和服务。我们往往会创建多个分散式的域,每个域的Administrator专注于维护特定域中的用户和资源,Admin...

1919

扫码关注云+社区