OCLint 安装使用

简介

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,同级目录下

image.png

1.3、运行脚本开始检测
OCLintDemo001.xcworkspace的名称
OCLintDemo001scheme
pmd是结果输出方式,最终以网页的形式输出

sh oclint.sh 

1.4、检测结果查看
检测完毕之后会生成 pmd.html ,检测的相关问题会整理在其中

image.png

检测结果.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

就能查询到相关的解释了
image.png

文档中会有相关的错误示例,可以对比自己的项目代码,怎么修改。
如果英文版本的看着不爽,也可以看热心网友翻译版本
https://blog.csdn.net/foolsong/article/details/77414695
https://www.jianshu.com/p/35cf99c07eaa

当然了,检测出的问题不一定就是问题,要根据自己的实际情况进行修改。

2、将分析结果直接以⚠️的形式展示在Xcode中

2.1、创建Aggregate

image.png

2.2、创建script
image.png

并在里面直接运行我们的 sh oclint.sh 脚本
image.png

2.3、修改脚本的最终展现形式
把脚本的

# 输出方式 xcode/pmd
reportType="pmd"

修改为

# 输出方式 xcode/pmd
reportType="xcode"

2.4、项目运行切换到 OCLint target,然后编译
这种方式更加直观

image.png

规则参数设置

移步到脚本规则部分,根据自己需求修改,修改完毕将影响到上面两种检测结果

# --命名
# 变量名字最长字节
#-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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容