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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容