前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 静态代码扫描之工具调研

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

原创
作者头像
腾讯移动品质中心TMQ
修改2017-08-17 09:43:19
5.4K0
修改2017-08-17 09:43:19
举报

作者:黄雪兰 团队:腾讯移动品质中心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!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、工具介绍
    • 1、coverity
      • 2、clang
        • 3、infer
        • 二、遇到的坑点
          • 1、缺少证书问题
            • 2、xcpretty安装
              • 3、infer增量分析
              • 三、扫描能力对比
              • 四、部分结果分析
                • 1、缺陷类
                  • 2、误报类
                  相关产品与服务
                  腾讯云代码分析
                  腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档