OCLint学习

作者: Aaron升 | 来源:发表于2021-03-29 23:57 被阅读0次

    传送门

    《OCLint规则查询&简单理解》

    Demo源码:https://gitee.com/hcsaaron/csoclint-demo

    安装OCLint及相关工具

    • 安装oclint:
    brew tap oclint/formulae
    brew install oclint
    
    • 安装xcpretty(增加xcodebuild输出的可读性)
    gem install xcpretty
    

    OCLint命令及使用

    1) cd进项目,查看项目信息
    cd /Users/xxx/CSOCLintDemo
    xcodebuild -list
    
    Command line invocation:
        /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list
    
    Information about project "CSOCLintDemo":
        Targets:
            CSOCLintDemo
            CSOCLintDemoTests
            CSOCLintDemoUITests
    
        Build Configurations:
            Debug
            Release
    
        If no build configuration is specified and -scheme is not passed then "Release" is used.
    
        Schemes:
            CSOCLintDemo
    
    
    2) 编译项目

    clean指定项目CSOCLintDemo,使用-project CSOCLintDemo.xcodeproj,然后再Debug编译项目。最后通过xcpretty,使用-r json-compilation-database可以生成指定格式的数据。

    编译成功后,会在项目的文件夹下出现 compile_commands.json文件:

    xcodebuild -project CSOCLintDemo.xcodeproj -scheme CSOCLintDemo clean \
    && xcodebuild -project CSOCLintDemo.xcodeproj -scheme CSOCLintDemo -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO \
    | xcpretty -r json-compilation-database -o compile_commands.json
    

    如果是用pod集成的项目,要使用-workspace CSSphinx.xcworkspace

    这里加上COMPILER_INDEX_STORE_ENABLE=NO,是因为报这个错oclint: error: compilation contains multiple jobs:

    如果要使用旧编译模式,需要加上-UseModernBuildSystem=NO

    3) 生成html报告

    使用oclint-json-compilation-database命令对上一步生成的json数据进行分析,对项目代码进行分析,最终生成oclintReport.html文件。OCLint目前支持输出html、json、xml、pmd、Xcode格式文件:

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

    用浏览器打开oclintReport.html展示如下:

    oclintReport.html
    4) 分析单个文件

    如何工程太大,分析太耗时间,可以单独分析某个文件或文件夹,替换掉下面的xxxx:

    oclint-json-compilation-database -i AppDelegate.m -- -report-type html -o oclintReport-AppDelegate.html
    

    OCLint的规则

    1) 通过-e忽略指定文件,可以指定多个

    假如你使用了CocoaPods依赖第三方库,你可能想忽略对Pods文件夹的分析:

    oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html
    
    2) 通过-rc改变检查规则的默认值

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

    oclint-json-compilation-database -- -report-type html -o oclintReport.html \
    -rc=LONG_LINE=200 \
    
    3) 通过-disable-rule可以禁止检查某一规则

    比如禁止UnusedMethodParameter检查未使用的方法参数(一般使用到的系统代理方法返回的参数都不一定会使用到,建议忽略此规则):

    oclint-json-compilation-database -- -report-type html -o oclintReport.html \
    -disable-rule UnusedMethodParameter \
    
    4) 通过-max-priority来设置允许的违例数

    如果超过违例个数,则失败,我们这里设置为9999个:

    oclint-json-compilation-database -- -report-type html -o oclintReport.html \
    -max-priority-1=9999 \
    -max-priority-2=9999 \
    -max-priority-3=9999 \
    

    在Xcode中通过脚本集成OCLint

    1) 创建Target,命名为OCLint
    创建Target
    2) 选中OCLint - Build Phases - New Run Script Phase
    创建Run Script
    3) 编写脚本

    根据自己的需求修改相关规则

    source ~/.bash_profile
    export LC_ALL="en_US.UTF-8"
    
    PROJECT_NAME="CSOCLintDemo.xcodeproj"
    TARGET_NAME="CSOCLintDemo"
    
    cd ${SRCROOT}
    rm -rf ./build/derivedData
    
    xcodebuild clean -UseModernBuildSystem=NO
    
    xcodebuild -project ${PROJECT_NAME} -scheme ${TARGET_NAME} -UseModernBuildSystem=YES -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json
    
    oclint-json-compilation-database -- -report-type Xcode \
    -rc=LONG_METHOD=50 \
    -rc=LONG_LINE=100 \
    -disable-rule ParameterReassignment \
    -disable-rule TooFewBranchesInSwitchStatement \
    -max-priority-1=9999 \
    -max-priority-2=9999 \
    -max-priority-3=9999 \
    
    exit
    
    3) Xcode运行OCLint

    Xcode中切换Scheme为OCLint,Command+B编译,由于脚本中-report-typexcode,编译成功后会在Xcode中展示相关issuse

    点击直接进入对应代码查看问题。

    Issues

    自定义规则

    可以看到,OCLint默认规则有的比较苛刻,我们可以修改脚本,适当提高相关规则的阈值。了解更多OCLint规则及使用,请移步《OCLint规则查询&简单理解》

    参考资料

    iOS静态分析:OCLint的使用

    iOS使用OCLint静态代码分析+jenkins集成

    相关文章

      网友评论

        本文标题:OCLint学习

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