简介
OCLint 官方文档
OCLint是一种静态代码分析工具,可以通过检查C,C ++和Objective-C代码并查找潜在问题来提高质量并减少缺陷。
* 可能的错误-if / else / try / catch / finally语句为空
* 未使用的代码-未使用的局部变量和参数
* 复杂的代码-高循环复杂度,NPath复杂度和高NCSS
* 冗余代码-冗余if语句和无用的括号
* 代码气味-长方法和长参数列表
* 错误做法-逻辑和参数的重新分配
* ...
安装
1、OCLint安装
网上有好几种安装方式,但是都或多或少的会遇到些阻碍,这里直接把我本地安装好的上传到网上,大家直接按照步骤配置一下即可。
https://github.com/yan998/OCLint0.15-BasicConfiguration
OCLint 基础配置,当前配置的对应官方0.15版本
1.1、第一步
cd /usr/local/bin
将下载项目的 bin 目录中的东西,拷贝到 /usr/local/bin 中
image.png
1.2、第二步
cd /usr/local/lib
将下载项目的 lib 目录中的东西<clang 和 oclint>,拷贝到 /usr/local/lib 中
image.png
1.3、重启终端,输入 oclint --version
OCLint (http://oclint.org/):
OCLint version 0.15.
Built Feb 21 2020 (12:56:28).
oclint安装成功
2、 xcodebuild安装
这个工具,安装Xcode之后就顺带安装了。。。
3、 xcpretty安装
在安装前,请确保机器已经安装Ruby gem。
使用如下命令安装xcpretty:
gem install xcpretty
使用
1、分析结果为Html报告
1.1、将下面的脚本拷贝的项目中并修改
#!/bin/bash
# 指定编码
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 name.xcworkspace clean命令,如果使用了clean命令,会清理编译缓存,本次操作需重新进行编译
# 然后使用xcpretty将编译结果输出成后面需要的.json文件
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 html -o pmd.html"
else
nowReportType="-report-type xcode"
fi
# 自定义report 如:
# nowReportType="-report-type html -o oclint_result.html"
# 生成报表
oclint-json-compilation-database ${exclude} -- \
${nowReportType} \
-rc=LONG_CLASS=1500 \
-rc=CYCLOMATIC_COMPLEXITY=10 \
-rc=NESTED_BLOCK_DEPTH=10 \
-rc=MAXIMUM_IF_LENGTH=10 \
-rc=SHORT_VARIABLE_NAME=5 \
-rc=MINIMUM_CASES_IN_SWITCH=10 \
-rc=LONG_VARIABLE_NAME=20 \
-rc=LONG_METHOD=200 \
-rc=LONG_LINE=300 \
-rc=NPATH_COMPLEXITY=200 \
-rc=NCSS_METHOD=30 \
-rc=TOO_MANY_FIELDS=20 \
-rc=TOO_MANY_METHODS=30 \
-rc=TOO_MANY_PARAMETERS=10 \
-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 "${reportType} ${REPORT_PMD}"
echo "-----分析失败-----"
return -1
else
echo '-----分析完毕-----'
return 0
fi
}
# 替换workspace的名字
myworkspace="OCLintDemo001.xcworkspace"
# 替换scheme的名字
myscheme="OCLintDemo001"
# 输出方式 xcode/pmd
reportType="pmd"
oclintForProject ${myworkspace} ${myscheme} ${reportType}
1.2、将sh文件放在和xxx.xcodeproj,同级目录下
1.3、运行脚本开始检测
OCLintDemo001
是.xcworkspace
的名称
OCLintDemo001
是scheme
pmd
是结果输出方式,最终以网页的形式输出
sh oclint.sh
1.4、检测结果查看
检测完毕之后会生成 pmd.html ,检测的相关问题会整理在其中
检测结果.png
可以根据后面相关的警告,查询具体的代码位置
比如:
image.png
Person.m 的 80行 56个字符处
unused method parameter
- (void)MyFunc:(NSString *)name age:(int)Age location:(NSString *)location {
NSLog(@"123");
}
OCLint说我们的location参数没有用到。
相关的警告也可以去官网查询
ps:查询的时候,把报错的原因中的空格删掉
unused method parameter
---->> unusedmethodparameter
就能查询到相关的解释了
image.png
文档中会有相关的错误示例,可以对比自己的项目代码,怎么修改。
如果英文版本的看着不爽,也可以看热心网友翻译版本
https://blog.csdn.net/foolsong/article/details/77414695
https://www.jianshu.com/p/35cf99c07eaa
当然了,检测出的问题不一定就是问题,要根据自己的实际情况进行修改。
2、将分析结果直接以⚠️的形式展示在Xcode中
2.1、创建Aggregate
2.2、创建script
image.png
并在里面直接运行我们的
sh oclint.sh
脚本image.png
2.3、修改脚本的最终展现形式
把脚本的
# 输出方式 xcode/pmd
reportType="pmd"
修改为
# 输出方式 xcode/pmd
reportType="xcode"
2.4、项目运行切换到 OCLint target,然后编译
这种方式更加直观
规则参数设置
移步到脚本规则部分,根据自己需求修改,修改完毕将影响到上面两种检测结果
# --命名
# 变量名字最长字节
#-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
网友评论