介绍
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 \
————————————————