iOS开发:几种静态扫描工具的使用与对比

作者: VilaZhang | 来源:发表于2017-05-02 10:40 被阅读2521次

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

    结果

    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

    相关文章

      网友评论

        本文标题:iOS开发:几种静态扫描工具的使用与对比

        本文链接:https://www.haomeiwen.com/subject/jglctxtx.html