市面上几种主流方案对比

名称 来源 功能特点 检查SQL 注入 检查 NullPointException 支持IDE情况
Clang Static Analyzer Apple XCode 自带工具 未测试 XCode
OCLint oclint.org 建立在 Clang 上的工具 未测试 未测试 XCode
infer facebook 针对Android/iOS的检查工具 Mac\Linux
godeyes 百度 针对Android/iOS,依赖规则检查,偏向于检查会引起Crash的内容,,检查规则只有几十条 Mac

(1)准确率:coverity > infer >clang > oclint;

(2)coverity扫描维度更多、发现问题更精准;infer、clang能发现部分coverity未发现的问题,但误报率较高,可作为补充扫描;

(3)infer发现的大部分问题为第三方库问题,后续加入过滤计划可提高扫描准确率;

(4)oclint扫描出的问题数量最多,但大多是开发不关注的问题,可过滤特定结果类型关注,更适合作为扫描代码复杂度的工具。

本文简单介绍了几种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

使用

  1. 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

  2. 将build/reports/compilation_db.json拷贝到工程目录下,重命名为compile_commands.json;
    mv build/reports/compilation_db.json 
    compile_commands.json

  3. 执行扫描,并且输出报告,注意这一步花费的时间会比较久;
    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

结果

分析结果会以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的文件夹,里面有分析日志

查看Inferout/bugs.text

更多相关文章

  1. 《Android(安卓)第一行代码》十一章 Service学习笔记
  2. EventBus3.x的正确打开方式
  3. Android系统启动流程源码分析
  4. ffplay2 android 版正式公布
  5. Android(安卓)Activity各种情况下的生命周期分析总结
  6. android中的多媒体应用MediaPlayer
  7. Android中Application分析
  8. Android进行单元测试难在哪-part4
  9. LiveData源码分析

随机推荐

  1. Android android控件动态使用
  2. 为什么会这样?
  3. Android 小人雕像
  4. Android 5.0 开机横屏修改
  5. Androidの应用引导页SplashActivity的巧
  6. Android的通信机制与网络(二)
  7. android surfaceview 指哪画哪升级版!
  8. Android将手机相册图片展示到GridView中
  9. Android进阶:十四、熟悉Android打包编译的
  10. MTK Android(安卓)平台开发之旅