本文简单介绍了几种iOS静态扫描工具:Clang Static Analyzer
、OCLint、Infer的使用方法和性能对比。
Clang Static Analyzer和xcode集成度更高、更好用,支持命令行形式,并且能够用于持续集成。OCLint有更多的检查规则和定制,和很多工具集成,也同样可用于持续集成。Infer效率高,规模大,几分钟能扫描数千行代码;支持增量及非增量分析;分解分析,整合输出结果。infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度。
Clang Static Analyzer:
Clang Static Analyzer是一款静态代码扫描工具,专门用于针对C,C++和Objective-C的程序进行分析。已经被Xcode集成,可以直接使用Xcode进行静态代码扫描分析,也可以单独在命令行下使用并提供html格式的输出报吿和xml格式的结果文件方便集成到Jenkins上进行展示。不过相对来说,csa对oc可用的检查器简直是少之又少,只有16条,而去大部分是核心向的比如空指针检测,类型转换检测,空判断检测,内存泄漏检测这种一出问题必须崩的blocker级错误,和代码风格相关的几乎没有,可配置性也比较差。
scan-build -k -v -v -o ./clangScanBuildReports \
xcodebuild - workspace PROJECT.xcworkspace \
-scheme SCHEME - configuration Debug -
sdk iphonesimulator ARCHS=i386 VALID_ARCHS=i386
OCLint:
OCLint 就是一个建立在 Clang 上的工具,能够发现代码中潜在的问题,可以用来提高质量和减少缺陷, 它目前支持C, C++, Objective-C语言
OCLint可以发现这些问题
- 可能的bug - 空的 if / else / try / catch / finally 语句
- 未使用的代码 - 未使用的局部变量和参数
- 复杂的代码 - 高圈复杂度, NPath复杂, 高NCSS
- 冗余代码 - 多余的if语句和无用的括号
- 坏味道的代码 - 过长的方法和过长的参数列表
- 不好的使用 - 倒逻辑和入参重新赋值
OCLint优点
- OCLint有更多的检查规则和定制,和很多工具集成,也同样可用于持续集成。
OCLint的安装与使用
安装
OClint:
brew tap oclint/formulae
brew install oclint
使用
-
xcodebuild编译输出为xcodebuild.log,并且利用xcodebuild.log和xcpretty工具生成了名为compilation_db.json的json格式文件,该文件应该包含了多组内容,其中的key分别为directory、command、file,注意此文件不应该为空。compilation_db.json文件的位置为build/reports/compilation_db.json;
xcodebuild -workspace ShopBranch.xcworkspace
- scheme ShopBranch clean build | tee
- xcodebuild.log | xcpretty --report json-
- compilation-databasench clean build | tee
- xcodebuild.log -
将build/reports/compilation_db.json拷贝到工程目录下,重命名为compile_commands.json;
mv build/reports/compilation_db.json
compile_commands.json -
执行扫描,并且输出报告,注意这一步花费的时间会比较久;
oclint-json-compilation-database -e Pods
-v -- -report-type html -o report.html
-max-priority-1=9999 -max-priority-2=9999
-max-priority-3=9999
结果
OCLint_report.png分析结果会以html的形式在主目录下生成,打开后,可以直观的看到工程里的报错、警告、语法规则等,规则详见OCLint官方规则文档中文说明:http://www.jianshu.com/p/35cf99c07eaa。
以及英文文档:http://docs.oclint.org/en/stable/rules/index.html
Infer:
Infer 是一个Facebook 的静态分析工具。Infer 可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。
Infer捕捉的bug类型
- C/OC中捕捉的bug类型
- 1:Resource leak
- 2:Memory leak
- 3:Null dereference
- 4:Premature nil termination argument
- 只在 OC中捕捉的bug类型
*1:Retain cycle
*2:Parameter not null checked
*3:Ivar not null checked
Infer优点
- 效率高,规模大,几分钟能扫描数千行代码;
- 支持增量及非增量分析(后边会解释)
- 分解分析,整合输出结果。(infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度)
Infer的安装与使用
安装
brew install infer
使用
$infer -- xcodebuild -workspace \
dianwoda.xcworkspace -scheme dianwoda \
-configuration Debug
分析结果
主目录下生成infer-out的文件夹,里面有分析日志
Infer-out.png查看Inferout/bugs.text
Infer-out-bugs.png
网友评论