起初要开始做ios静态代码检查的时候我是想要参考平台上的一篇文章OC静态代码检查实战,但是经过实践发现,项目经过编译并格式化后的json文件25m,执行
oclint-json-compilation-database -- -report-type pmd -o report.html
直接抛出os error的错误,多番查找资料和官方论坛后解决无果,所以尝试使用scan-build。
本项目采用的是scan-build + xcodebuild相结合的方式进行静态代码检测并且输出报告,希望对于项目采用xcode8以上以及项目相对复杂,不能使用oclint进行静态代码检测的项目提供一些帮助。
一、 xcodebuild的概念及使用
xcodebuild 是苹果提供的打包项目或者工程的命令,xcode的使用方式使用如下:
1)需要在包含 name.xcodeproj 的目录下执行 xcodebuild 命令,且如果该目录下有多个 projects,那么需要使用 -project 指定需要 build 的项目。
2)在不指定 build 的 target 的时候,默认情况下会 build project 下的第一个 target
3)当 build workspace 时,需要同时指定 -workspace 和 -scheme 参数,scheme 参数控制了哪些 targets 会被 build 以及以怎样的方式 build。
另外,要说下的是这里为什么不使用xctool,xcode升级到xcode8以后,xctool就不再支持了,所以如果你们程序大大手抖升级完xcode以后,请使用xcodebuild。
二、 scan-build的概念及工作原理
Scan-build 是一个命令行工具,它能够帮助使用者运行静态分析器检查他们的代码, 找出代码的缺陷。
当一个项目在构建中,源文件在编译时同时也被静态分析器有序的检查着。当构建完成时,结构将会作为一个web网页的形式呈现给使用者。
三、 scan-build工作的编译环境
你如何编写代码与scan-build是没有任何关系的。scan-build可以使用一个伪编译器代替原来那个可以正常构建你的项目的编译器来编译你的代码,默认情况下,这个伪编译器使用gcc来编译你的代码,然后执行静态分析器进行代码分析。scan-build通过gcc来分析已经编译了的源文件。也就是说,没有被编译的文件是不会被分析的。
四、 scan-build的使用方法
scan-build的基本使用方式很简单,只需在你的命令行开头输入scan-build即可。
下面是scan-build命令的通用格式:$scan-build [scan-build options] <command> [command options]
当然我们可以用scan-build来分析具体的文件:
$scan-build gcc –c t1.c t2.c
这个命令实现对t1.c和t2.c文件的分析。 其它参数像上面所提到的,scan-build能够处理一些额外的参数。有些参数作为命令的前缀。
例如:
$scan-build –k –v make
$scan-build –k –v xcodebuild
下面是一些常用的参数:
-o html 报告文件的存放目录。可以按需要创建一些子目录,来区分每个运行的分析器。如果没有指定这个参数,默认将报告文件保存在/tmp目录里。
-h 显示scan-build的所有参数
-k 增加一个继续运行的参数到具体的命令中
-v 冗余输出结果。可以选择2个或3个”-v”增加冗余度。
-V 当命令完成后,在浏览器中查看运行结果,执行完成后会默认打开。
五、 scan-build的输出结果
scan-build的输出结果是一个HTML文件集合,每个html文件代表一个独立的缺陷报告。index.html文件是用来查询所有的缺陷。你可以用浏览器打开index.html文件查看所有缺陷报告。
scan-build会打印出报告所在路径。如果你想在命令执行完后立即去查看报告,那么你应该传入一个-V参数。
报告如下:
报告下面会有具体的错误以及对应的代码及错误分析:
六、 集成到jenkins
1、增加构建步骤,命令行构建
scan-build --use-cc clang --use-analyzer=/usr/bin/clang xcodebuild
2、增加构建后步骤,html的展示
(1) 图中Publish Clang Scan-Build Results是为了展示每次的构建bug数变化,在jenkins页面上会有展示
(2) Publish HTML reports是为了展示具体的构建结果,即上面图中的报告
3、 遇到的问题
1、直接使用scan-build编译不通过
在安装完成scan-build后编译,无法编译成功,原因是scan-build是用gcc编译的,但是目前的工程用gcc无法编译通过(包括很多使用第三方库的项目),在一个不知名的网站上找到一行命令尝试解决成功
scan-build --use-cc clang --use-analyzer=/usr/bin/clang xcodebuild
红字部分主要的作用是指定编译器是llvm,而不是默认的gcc
2、报告无法展示
安装 Clang Scan-Build Plugin 并且在构建后操作里面配置 Publish Clang scan-build reports,并指定report的路径,否则无法在jenkins上看到报告结果。
本文来自网易实践者社区,经作者孟志斌授权发布。