美文网首页工具
OCLint基本使用(一)

OCLint基本使用(一)

作者: Money_YC | 来源:发表于2020-12-07 13:01 被阅读0次

    一.简介

    OCLint是基于 Clang Tooling 开发的静态分析工具,主要用来发现编译器检查不到的那些潜在的关键技术问题。主要包括语法上的基础规则、Cocoa 库相关规则、一些约定俗成的规则、各种空语句检查、是否按新语法改写的检查、命名上长变量名短变量名检查、无用的语句变量和参数的检查。

    OCLint是一个通过检查C,C++或Objective-C代码来提高代码质量、降低错误率的静态代码分析工具,代码通过OCLint检测后,可以发现一些潜在的问题

    • 可能的缺陷 - 空的if / else / try / catch / finally语句
    • 未使用的代码 - 未使用的局部变量和参数
    • 复杂的代码 - 很高的圈复杂度,NPath复杂性和太高的-NCSS
    • 代码异味 - 长方法和参数列表
    • 长方法和参数列表不好的实践——倒逻辑和参数重新分配
      静态代码分析是一个来检测对于编译不可见的缺陷的关键技术。
      以上翻译自OCLint官网

    NPath复杂度是一个方法中各种可能的执行路径总和 ;
    NCSS有效代码行

    • OClint使用的简单逻辑

    OCLint工具集有三个命令:

    oclint
    oclint-json-compilation-database
    oclint-xcodebuild
    其功能可以简单概括为:
    oclint 是 OCLint 工具集最主要的指令,主要作用是规则加载、编译分析选项以及生成分析报告
    oclint-json-compilation-database 的作用是在 JSON Compilation Database format 类型的编译文件 compile_commands.json 中提取必要的信息。
    oclint-xcodebuild 用于将 xcodebuild 生成的 log 文件 xcodebuild.log 转换为 JSON Compilation Database format 类型

    这里再对上面的解释做个进一步描述:
    compile_commands.json 文件是编译完成后提取并生成的信息文件。需要了解这个文件的生成,就需要使用命令xcodebuild以及oclint-xcodebuild。
    由于oclint-xcodebuild已经不再维护,一般我们使用xcpretty代替。


    截屏2020-12-07 下午2.20.24.png

    二.安装

    安装方式为 Homebrew、下载安装包安装。 个人建议使用Homebrew方式安装,更简单方便些。

    1.使用Homebrew安装

    安装Homebrew - Homebrew官网

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    

    在安装brew的时候会有443等问题.如

    curl: 7Failed to connect to raw.githubusercontent.com port 443
    

    解决办法:发现是 github 的一些域名的 DNS 解析被污染,导致DNS 解析过程无法通过域名取得正确的IP地址。可以通过修改/etc/hosts文件可解决该问题。
    打开 https://www.ipaddress.com/ 输入访问不了的域名,获得对应的IP。
    使用vim /etc/hosts命令打开不能访问的机器的hosts文件

    199.232.68.133 raw.githubusercontent.com
    

    199.232.68.133是raw.githubusercontent.com所在的服务器IP

    1. 打开 https://www.ipaddress.com/ 输入访问不了的域名,获得对应的IP。

    Homebrew安装完成之后,执行brew命令安装第三方依赖库-oclint/formulae

    brew tap oclint/formulae
    

    接下来就可以安装oclint,目前的最新版本应该是OCLint version 0.13.

    brew install oclint
    

    运行oclint确认环境配置正确

    oclint
    oclint: Not enough positional command line arguments specified!
    Must specify at least 1 positional arguments: See: oclint -help
    

    2.安装xcodebuild

    xcodebuild是xcode的编译命令,xcode 下载安装好就已经成功安装了,无需额外安装

    xcodebuild是Xcode里面的工具,其实包含了静态代码分析的功能,打开项目后,可以通过菜单的Product->Analyze来对代码进行扫描。 截屏2021-02-18 下午8.43.59.png
    经过长时间的解析后也可以得到些结果。这种检查方式好处是方便,直接在xcode中运行,并且可以按不同的方式查看静态代码的错误,点击左侧的代码可以直接跳转至有问题的代码。

    但是不足之处也是显而易见的。对于QA来说,需要定期执行静态代码检查,势必要加入到持续集成系统中,最好是可以通过命令行执行;并且我们需要的是一个分类统计的结果,逐条列出便于跳转的结果方便开发自查,但不方便QA对代码质量进行把控。

    3.安装xcpretty

    gem install xcpretty
    

    需要使用OCLint对日志信息进行分析运行命令,安装xcpretty,使用xcpretty命令分析日志信息。xcpretty是用来格式化xcodebuild输出的工具,使用ruby开发。

    三、使用

    1.进入项目更目录

    cd /Users/admin/Desktop/OClint 
    

    查看项目基本信息

    xcodebuild -list
    

    输出为

    Information about project "OClint":
        Targets:
            OClint
    
        Build Configurations:
            Debug
            Release
    
        If no build configuration is specified and -scheme is not passed then "Release" is used.
    
        Schemes:
            OClint
    

    这里显示了对应项目的Schemes

    2.编译项目

    先clean指定项目OClint,因为集成了pod,所以使用OClint.xcworkspace;然后再Debug 编译项目了;最后通过xcpretty,使用 -r json-compilation-database 可以生成指定格式的数据。编译成功后,会在项目的文件夹下出现 compile_commands.json 文件

    xcodebuild -scheme OClint -workspace OClint.xcworkspace clean && xcodebuild -scheme OClint -workspace OClint.xcworkspace -configuration Debug | xcpretty -r json-compilation-database -o compile_commands.json
    

    每次编译之前需要 clean
    这时候就会生成根目录下就会生成compile_commands.json文件,我们需要把compile_commands.json生成html报表。使用 oclint-json-compilation-database 命令对上一步生成的json数据进行分析,对项目代码进行分析,最终生成report.html文件。OCLint目前支持输出html,json,xml,pmd,Xcode格式文件。

    oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html
    

    如果项目工程太大,整个 lint 会比较耗时,所幸 oclint 支持针对某个代码文件夹进行 lint

    oclint-json-compilation-database -i 需要静态分析的文件夹或文件 -- -report-type html -o oclintReport.html  其他的参数
    

    有时候错误信息比较多利用下面的脚本则可以将报错信息写入 log 文件,方便查看

    oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html 2>&1 | tee 1.log
    

    此时会在根目录下生成oclintReport.html文件


    截屏2020-12-07 上午10.44.05.png

    OCLint的分析结果:
    优先级的级别是从Priority 1, Priority 2, Priority 3 依次降低的
    Total Files 总文件数
    Files with Violations 违规文件数
    Compiler Warnings 表示项目中的警告⚠️
    Compiler Errors 表示编译错误
    Location 表示警告的位置
    报告中的描述其实非常清晰,一般找到代码位置,结合代码理解

    3.自定义规则

    一些常用规则

    # --命名
    # 变量名字最长字节
    #-rc=LONG_VARIABLE_NAME=20 \
    # 变量名字最短字节
    #-disable-rule ShortVariableName \
    # --size
    # 圈复杂度
    #-re=CYCLOMATIC_COMPLEXITY=10 \
    # 每个类最行数
    #-rc=LONG_CLASS=700 \
    # 每行字节数量
    #-rc=LONG_LINE=200 \
    # 每个方法行数
    #-rc=LONG_METHOD=80 \
    # 忽略注释后括号后的有效代码行数
    #-rc=NCSS_METHOD=40 \
    # 嵌套深度
    #-rc=NESTED_BLOCK_DEPTH=5 \
    # 字段数量
    #-rc=TOO_MANY_FIELDS=20 \
    # 方法数量
    #-rc=TOO_MANY_METHODS=30 \
    # 方法参数
    #-rc=TOO_MANY_PARAMETERS=6
    
    OCLint的规则

    规则加载选项
    -R <目录>:指定规则加载的目录。可以是多个目录,用空格隔开,默认情况下会搜索 $(oclint 可执行文件目录)/../lib/oclint/rules。
    -disable-rule <规则名> 通过规则名使某些验证规则失效。
    -rc <参数>=<值> 修改某些阈值。
    -i:包含进某些文件
    -e:过滤掉某些文件

    1)可以通过 -e 参数忽略指定的文件,比如忽略Pods文件夹:
    通过 -- 的方式在指令的最后 oclint 选项
    通过-o 选项,表示将报告输出到当前目录的 report.html 文件中

    oclint-json-compilation-database -e Pods -- -o=report.html
    

    2)通过-rc改变检查规则的默认值

    oclint-json-compilation-database -- -rc=LONG_LINE=200 -o=report.html
    
    oclint-json-compilation-database -e Pods -rc=LONG_LINE=200-- -o=report.html
    

    比如有一条默认规则:long line [size|P3] Line with 137 characters exceeds limit of 100 ,这表示一个方法里的代码行数不能超过100,可以通过-rc改变默认100行的限制比如改成200行
    3)通过 -disable-rule可以禁止某一规则,比如禁止LongLine长方法检查:

    oclint-json-compilation-database -e Pods -rc=LONG_LINE=200-- -o=report.html
    

    4)报表最后显示问题

    oclint: error: violations exceed threshold
    P1=0[0] P2=0[10] P3=29[20] 
    

    P3=29[10]是说P1(Normal级别 Warning)发现29个,但是限制为20个,超过20个则失败。因此通过-max-priority-3=9999修改阈值

    相关文档

    OCLint Documentation
    Using OCLint with xcodebuild
    Using OCLint with Xcode
    oclint-json-compilation-database
    json-compilation-database

    相关文章

      网友评论

        本文标题:OCLint基本使用(一)

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