OCLint

作者: LJDeveloper | 来源:发表于2020-07-20 20:03 被阅读0次

    介绍

    OCLint是一个静态分析工具,支持C,C++,Objective-C代码,可以高效的实现Code Review的自动化,检查代码中的缺陷:

    * 可能出现的 bug:if/else/try/catch 等条件语句空的声明

    * 未使用的局部变量和参数

    * 高圈复杂度,NPath复杂度和高NCSS

    * 冗余if语句和无用的括号

    * 长方法和长参数列表

    * 倒置逻辑和参数重新分配

    安装

    Homebrew安装 (需要科学上网)

    $ brew tap oclint/formulae

    $ brew install oclint

    查看是否安装成功

    $ oclint

    出现下面的提示则证明OClint安装成功

    oclint: Not enough positional command line arguments specified!

    Must specify at least 1 positional arguments: See: oclint -help

    xcobuild的安装

    sudo gem install -n /usr/local/bin xcpretty

    使用

    项目中引入oclint.sh文件 如图:

    ..

    oclint.sh源码奉上:

    #!/bin/bash

    # 指定编码

    export LANG="zh_CN.UTF-8"

    export LC_COLLATE="zh_CN.UTF-8"

    export LC_CTYPE="zh_CN.UTF-8"

    exportLC_MESSAGES="zh_CN.UTF-8"

    exportLC_MONETARY="zh_CN.UTF-8"

    export LC_NUMERIC="zh_CN.UTF-8"

    export LC_TIME="zh_CN.UTF-8"

    functioncheckDepend () {

    command-v xcpretty >/dev/null2>&1|| {

    echo >&2 "I require xcpretty but it's not installed.  Install:gem install xcpretty";

    exit

    }

    command-v oclint-json-compilation-database >/dev/null2>&1|| {

    echo >&2 "I require oclint-json-compilation-database but it's not installed.  Install:brew install oclint";

    exit

    }

    }

    functionoclintForProject () {

    # 检测依赖

    checkDepend

    projectName=$1

    scheme=$2

    reportType=$3

    REPORT_PMD="pmd"

    REPORT_XCODE="xcode"

    myworkspace=${projectName}

    myscheme=${scheme}

    echo"myworkspace是:${myworkspace}"

    echo"myscheme是:${myscheme}"

    echo"reportType为:${reportType}"

    # 清除上次编译数据

    if[ -d ./build/derivedData ];then

    echo '-----清除上次编译数据derivedData-----'

    rm -rf ./build/derivedData

    fi

    # xcodebuild -workspace $myworkspace -scheme $myscheme clean

    xcodebuild clean

    echo '-----开始编译-----'

    # 生成编译数据

    xcodebuild -workspace ${myworkspace} -scheme ${myscheme} -UseModernBuildSystem=NO -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json

    if[ -f ./compile_commands.json ]

    then

    echo '-----编译数据生成完毕-----'

    else

    echo "-----生成编译数据失败-----"

    return -1

    fi

    echo '-----分析中-----'

    # 自定义排除警告的目录,将目录字符串加到数组里面

    # 转化为:-e Debug.m -e Port.m -e Test

    exclude_files=("Pods","NetWorks")

    exclude=""

    foriin${exclude_files[@]};do

    exclude=${exclude}"-e "${i}" "

    done

    echo"排除目录:${exclude}"

    # 分析reportType =~判断子字符串包含关系

    if[[ ${reportType} =~ ${REPORT_PMD} ]]

    then

    nowReportType="-report-type html -o pmd.html"

    else

    nowReportType="-report-type xcode"

    fi

    # 自定义report 如:

    # nowReportType="-report-type html -o oclint_result.html"

    echo"**************${nowReportType}"

    # 生成报表

    oclint-json-compilation-database ${exclude} -- \

    ${nowReportType} \

    -rc=LONG_CLASS=2000\

    -rc=NESTED_BLOCK_DEPTH=10\

    -rc=LONG_VARIABLE_NAME=80\

    -rc=LONG_METHOD=500\

    -rc=LONG_LINE=300\

    -rc=MAXIMUM_IF_LENGTH=  100\

    -disable-rule ShortVariableName \

    -disable-rule ObjCAssignIvarOutsideAccessors \

    -disable-rule AssignIvarOutsideAccessors \

    -max-priority-1=100000\

    -max-priority-2=100000\

    -max-priority-3=100000

    #rm compile_commands.json

    if[[ ${reportType} =~ ${REPORT_PMD} ]] && [ ! -f ./pmd.html ]

    then

    echo "-----分析失败-----"

    return -1

    else

    echo '-----分析完毕-----'

    return 0

    fi

    }

    # 替换workspace的名字

    myworkspace="xxx.xcworkspace"

    # 替换scheme的名字

    myscheme="xxx"

    # 输出方式 xcode/pmd

    reportType="pmd"

    oclintForProject ${myworkspace} ${myscheme} ${reportType}

    OCLint规则

    #忽略if折叠

    -disable-rule CollapsibleIfStatements \

    #忽略 直接使用变量

    -disable-rule ObjCAssignIvarOutsideAccessors \

    #switch case最少数量

    -rc=MINIMUM_CASES_IN_SWITCH=3 \

    #变量名字最长字节

    -rc=LONG_VARIABLE_NAME=20 \

    #变量名字最短字节

    -disable-rule ShortVariableName \

    #圈复杂度

    -rc=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 \

    -report-type xcode \

    ————————————————

    相关文章

      网友评论

          本文标题:OCLint

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