介绍 GodEyes-iOS —— iOS 源码 crash 隐患静态扫描工具。
GodEyes-iOS 是一款针对 iOS App 的源码 crash 隐患扫描工具。特点包括:
一个典型的过程是每次完成你的 iOS 项目的迭代后,就使用 GodEyes 扫描一次你的工程的代码。然后打开扫描结果,定位到上面列举的存在隐患的代码,确认一下是否存在隐患,然后对问题代码进行修改。你也可以很轻松地将它作为持续集成的其中一步,通过解析生成的 json 结果文件,得到当前的代码隐患情况,并作为判断持续集成状态的其中一个项目。
GodEyes-iOS 还有一个兄弟 GodEyes-Android,顾名思义,GodEyes-Android 所针对的是 Android APP 源码的静态扫描。
下文将重点介绍 GodEyes-iOS。出于方便,下文一律将 GodEyes-iOS 简称为 GodEyes。
官网下载:http://godeyes.duapp.com/ 。
本文将主要介绍 v2.0 版本的使用。
打开 conf/config.ini 配置文件,根据你的项目需求,进行如下设置:
1 | xctoolCommand = xctool/bin/xctool -project ${projectPath}/HelloWorld.xcodeproj -scheme HelloWorld -sdk iphonesimulator -reporter json-compilation-database:${projectPath}/compile_commands.json clean build |
其中各参数分别为:
参数 | 说明 |
---|---|
-project 或 -workspace |
主工程文件的地址。如果工程文件的后缀名是 xcodeproj ,则通过 -project 指定,后面跟着 xcodeproj 文件的地址;如果工程文件的后缀名是 xcworkspace ,则通过 -workspace 指定,后面跟着 xcworkspace 的地址。 |
-scheme |
要进行扫描的工程方案。你可以在 XCode 中点击 Products->Scheme->Manage Schemes… 来查看当前工程的所有 Scheme 。 |
-sdk |
用于生成编译数据库的编译SDK,不管是 iPhone 还是 iPad 应用,模拟器都为 iphonesimulator,真机都为 iphoneos。 |
-reporter |
这句话告诉 xctool 要生成编译报告,如无特殊情况一般不用修改。 |
xctool/bin/xctool --help
命令来获取更详细的帮助,或者在网上搜索更多关于如何利用 xctool 生成编译数据库的资料。
完成配置后,cd 进入 godeyes 目录,然后直接 sh run.sh
执行脚本即可。
如果你看到红色的文字,就说明检测到了可能存在 crash 隐患的代码。扫描完成后,可以通过阅读生成的结果文件获得更详细的扫描结果。一份 HTML 格式的扫描结果如下所示:
如果之前已经使用 GodEyes 扫描过你的工程,那么再次使用 GodEyes 时会提示你是否要覆盖编译数据库,如下图所示:
如果你的工程文件列表已经发生改变(比如增删了代码文件,或改动了文件位置),则需要输入 y
重新生成编译数据库。如果想每次输入都自动重新创建编译数据库,则可以在执行脚本时跟上 -f
参数。否则可以输入 n
,直接利用之前创建好的编译数据库,以节省时间。
执行 run.sh 时,还支持带有如下一些命令行参数:
参数 | 说明 |
---|---|
-l |
列举所有已启用的规则。 |
-d |
诊断模式,在执行扫描时会打印出更多的错误信息以便于诊断。通常情况下不需要开启这个选项。 |
-f |
每次运行时都默认重新生成编译数据库,而不再弹出询问信息,适合需要跑自动化的用户。 |
-h |
打印帮助信息。 |
1 | xctool/bin/xctool --help |
来打印 xctool 的帮助,也可以访问 xctool 的 Github 主页获得更多的帮助。
Q 运行过程中出现 "LLVM ERROR: Could not auto-detect compilation database for file XXX/XXX/XXX"、"No compilation database found in XXX/XXX/XXX or any parent directory。" 等类似错误。如果确实需要同时启用多个 GodEyes 扫描多个工程,可以再拷贝一份 GodEyes 目录,删掉新目录下的 godeyes.tmp 文件,然后在不同的目录下执行各自的 GodEyes 程序,由于读取的是不同位置的 godeyes.tmp 临时文件,就不会出现这个问题。
Q 扫描得到的 json 结果文件怎么阅读?一个经过格式化的 json 结果如下:
1 | { |
json 是逐条规则列出违反清单的。
从上面的结果可以看出,该项目违反了 1 次“函数返回值必须与实际返回类型一致隐患”规则,违反位置在 /Users/wzpan/Documents/workspace/HelloWorld/HelloWorld/MyCircle.m
文件中的第 75 行。