静态代码分析工具及框架

OCLint CodeReview静态代码分析

2018-05-11  本文已影响30人  handsome5

前言

OCLint 是一个静态分析代码的工具,支持自定义规则,可以很好地帮助我们规范代码,提高代码质量,是团队开发CodeReview一大利器,本文主要通过OCLint让XCode来Code Review,网上的资料挺多的,(但还是有些坑)记录下方便自己以后越坑.
OCLint相关的详细内容也可以到OCLint官网上查看。

安装OCLint 和 xcpretty

  1. 安装xcpretty
    用gem安装xcpretty
    sudo gem install xcpretty
    用sudo是防止一些权限出现问题

安装OCLint

1)通过安装包:
从oclint的github项目链接下载安装
OCLINT_HOME=/pathexport PATH=$PATH:OCLINT_HOME/bin
然后source .bashrc即可

2)通过Homebrew
brew tap oclint/formulae
brew install oclint

3)确认安装成功
运行oclint确认环境配置正确
$ oclint
如果展示以下内容即为安装成功:
oclint: Not enough positional command line arguments specified!Must specify at least 1 positional arguments: See: oclint -help

4)oclint的版本
oclint --version
which oclint oclint存放位置

OCLint 三个指令

1)oclint常规核心指令
oclint [options] <source> -- [compiler flags]
[options]为一些参数选项,可以是规则加载选项、报告形式选项等:

  1. -R <路径> : 检测所用的规则的路径,默认路径$(/path/to/bin/oclint)/../lib/oclint/rules
  2. -disable-rule <规则名>: 让相对应的规则失效(OCLint 规则列表)。
  3. -rc <参数>=<值> :修改阈值
  4. -report-type <报告类型>,有"text"、“html”、“json”、“pmd”、“xcode”几个类型
  5. -o <路径> 报告生成路径.
    eg oclint -R /path/to/rules -disable-rule ObjCAssignIvarOutsideAccessors -report-type xcode

2)oclint-json-compilation-database
从编译好的compile_commands.json 文件中读取配置信息并执行 oclint。
主要用于生成compile_commands.json文件,现在已经不进行维护了,我们可以用xcpretty替代,来生成json文件.
oclint-json-compilation-database 指令
这是我们主要用到的指令,它是oclint 指令的升级版,使用起来相对 oclint 指令简单方便。可以通过 -- 的方式在指令的最后加上oclint 选项。
oclint-json-compilation-database 指令有过滤文件选项
-i :包含进某些文件
oclint-json-compilation-database -i Pods
-e : 过滤掉某些文件
oclint-json-compilation-database -e Pods

3)oclint-xcodebuild 指令
oclint-xcodebuild 指令不再维护,实际应用中用xcpretty代替.

OCLint使用

1)新建工程AddTest添加Aggregate

075F858D-C8F3-4B97-BF59-FC8C8DA95925.png

2)选择Aggregate

2ACF7D44-CF28-4F6D-BDD2-86416762945D.png

3)点击next输入ProductName

图片.png

4)建立运行脚本

C480D7AC-D0E5-48BB-BB1B-790EC8E3C670.png

5)配置运行脚本

CA419EC0-8487-4F3D-9102-3674258695EC.png

6)运行结果

87EE9D72-60DB-4A33-B39E-02067599AA53.png

***注意点 ***

1.在根目录下新建文件oclint,然后进入oclint文件夹,touch oclint.sh
2.sh脚本不对,路径不对都很容易gg,有些运行成功但是不报警告,需要检查下路径.
3 oclint.sh脚本

export LANG="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_ALL=

function checkDepend () {
    command -v xcpretty >/dev/null 2>&1 || { 
        echo >&2 "I require xcpretty but it's not installed.  Install:gem install xcpretty"; 
        exit
        }
    command -v oclint-json-compilation-database >/dev/null 2>&1 || { 
        echo >&2 "I require oclint-json-compilation-database but it's not installed.  Install:brew install oclint"; 
        exit
        }
}

function oclintForProject () {

    # 检测依赖
    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} -sdk iphonesimulator -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=("cardloan_js" "Pods")

    exclude=""
    for i in ${exclude_files[@]}; do
        exclude=${exclude}"-e "${i}" "
    done
    echo "排除目录:${exclude}"

    # 分析reportType
    if [[ ${reportType} =~ ${REPORT_PMD} ]] 
        then
        nowReportType="-report-type pmd -o pmd.xml"
    else    
        nowReportType="-report-type xcode"
    fi
    # 自定义report 如:
    # nowReportType="-report-type html -o oclint_result.html"

    # 生成报表
    oclint-json-compilation-database ${exclude} -- \
    ${nowReportType} \
    -rc LONG_LINE=200 \
    # --命名
    # 变量名字最长字节
    -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=50 \
    # 方法参数 #
    -rc=TOO_MANY_PARAMETERS=6
    -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.xml ]
    then
        echo "-----分析失败-----"
        return -1
    else
        echo '-----分析完毕-----'
        return 0
    fi
}

# 替换workspace的名字
myworkspace="AddTest.xcworkspace"
# 替换scheme的名字
myscheme="AddTest"
# 输出方式 xcode/pmd
reportType="xcode"

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

下面是几个参考链接,我获益良多,建议深入阅读,尤其是里面的例子…

http://oriochan.com/codeReview01.html
http://www.cocoachina.com/ios/20170928/20669.html

上一篇下一篇

猜你喜欢

热点阅读