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 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

通用权限的思路。带有数据库关系图

写完了就要提交了,想向上传一个图片,IE居然死掉了,白写了,还得重来一遍。郁闷。     上一篇主要是想说一下大体的思路,就是一个主要的框架,我觉得在做一件...

2226
来自专栏黑白安全

M7lrvCms_Beta3.0破解版 一款自动化渗透神器

    1:exp更新到145个CMS系统(具体太多了没法一一举例,特别说明:免费版去除了getshell功能!!!不要问我为什么,这种简单的问题想想也知道!!...

2034
来自专栏腾讯NEXT学位

阅读前端项目源码的正确姿势!

1234
来自专栏ccylovehs

网络爬虫之html2md

上周利用java爬取的网络文章,一直未能利用java实现html转化md,整整一周时间才得以解决。

631
来自专栏IT 指南者专栏

指南者博客测试版正式上线,没有域名,只有IP,欢迎访问!

指南者博客访问地址: http://120.79.207.130/ 其实是有域名的,由于没有备案的原因,访问一个月后,基本就不可以访问了,详情如下图。 ? 因...

3428
来自专栏Crossin的编程教室

一键下载:将知乎专栏导出成电子书

老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python 和爬虫,可以完成怎样的小工具。

1231
来自专栏互联网高可用架构

Bash脚本编程资料共享

1022
来自专栏小程序·云开发专栏

小程序·云开发:新手常见问题全解答

小程序·云开发 文档里,则是所有与小程序·云开发相关的文档内容。下面会通过用户关心的的一些问题,介绍在哪里可以找到对应的文档。

4437
来自专栏编程

深入认识 vue-cli:能做的不仅仅是初始化 vue 工程

相信对于大部分使用过VueJS的同学来说, 是他们非常熟悉的一个工具。借助 ,我们通过非常简单的问答形式,方便地初始化一个vue工程,完全不需要担心繁复的web...

2018
来自专栏魏艾斯博客www.vpsss.net

Avada 主题导入 improt failed 和 wp_remote_get 怎么解决?

群友搭建 avada 主题的企业站点,导入主题发生以下错误:import failed,演示服务器无法访问,请检查系统状态页面上的 wp_remote_get。

731

扫码关注云+社区