OCLint静态代码分析

1.安装

// 安装OCLint
sudo brew tap oclint/formulae
sudo brew install oclint
// 安装xcpretty
sudo gem install xcpretty

gem install xcpretty报错:

错误:执行gem时(Gem :: FilePermissionError)

重新安装冲泡后在安装xcpretty

brew安装红宝石

确认安装成功

运行oclint确认环境配置正确

1
$ oclint

如果展示以下内容即为安装成功:

1
oclint: Not enough positional command line arguments specified!Must specify 

2. 更新

// 以后可能需要更新
brew update
brew upgrade oclint

3.使用

Xcode IDE

oclint 可以和 Xcode IDE 结合,把错误直接在 IDE 中显示出来。

首先,我们在项目中创建一个新的 target,然后选择 Aggregate 作为模板。

然后给这个 target 命名,注意我们可以建立多个 target,然后分别关注代码分析的多个方面。

然后在 Build Phases 选项卡中选择 Add Run Script。

关于脚本的编写我们仍然选择最简单的方式,即 xcodebuild + xcpretty + oclint-json-compilation-database 的方式来做 oclint。脚本如下:

myworkspace=haha.xcworkspace # 替换workspace的名字
myscheme=haha # 替换scheme的名字
xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
xcodebuild -workspace $myworkspace -scheme $myscheme \
-configuration Debug \
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -- \
-report-type html -o oclint_result.html \
-rc LONG_LINE=200 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json;
if [ -f ./oclint_result.html ]; then echo '-----分析完毕-----'open oclint_result.html

else echo "-----分析失败-----"; fi

过滤选项

  • -I包括,-include INCLUDES,-include包括:

  • -e EXCLUDES,-exclude EXCLUDES,-exclude EXCLUDES:

调试选项

  • -v:通过这个选项可以输出最终执行的oclint指令。

  • -debug:开启这个选项会给出更详细的信息。但是同样这个选项只有在OCLint的debug标示开启的时候才有效。

可以通过 -- 的方式在指令的最后加上oclint 选项。

中间可能会在Build Succeeded后面等待一段时间,这是因为OCLint在分析文件

等待命令执行完成,终端会打印出 -----分析完毕-----字样,
打开项目目录,会看到目录下会多出一个** oclint_result.html **的文件

如果没有使用cocoapods,则去掉myworkspace=haha.xcworkspace-workspace $myworkspace-workspace $myworkspace,然后再在终端执行

另外可以自己建一个xx.sh的文件,将上面代码粘贴进去,每次在命令行进入xx.sh所在目录执行bash xx.sh就可以了

结果查看

双击打开oclint_result.html文件,样式如下
OCLint的分析结果:
优先级的级别的英文从Priority 1, Priority 2, Priority 3依次降低的
Total Files总文件数
Files with Violations违规文件数
Compiler Warnings表示项目中的警告⚠️
Compiler Errors表示compile-错误
Location表示警告的位置
报告扩展中的描述其实非常清晰,一般找到代码位置,结合代码理解下,基本自己都能明白了
可以直接复制路径到铬打开查看,右击查看源码就有行号

OCLint有三个指令

OCLint有三个指令:oclint,oclint-json-compilation-database,oclint-xcodebuild。

  1. oclint:常规核心指令。

  2. oclint-json-compilation-database:从编译好的compile_commands.json文件中读取配置信息并执行oclint。

  3. oclint-xcodebuild联编:主要用于生成compile_commands.json文件,现在已经不进行维护了,我们可以用xcpretty替代,来生成JSON文件。

oclint指令

使用语法

1
oclint [options] <source> -- [compiler flags]

[选项]为一些参数选项,可以是规则加载选项,报告形式选项等:

  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 <路径>报告生成路径。

例如:

1
oclint  -R  /path/to/rules   -disable-rule ObjCAssignI var OutsideAccessors -report-type xcode

oclint-json-compilation-database指令

这是我们主要用到的指令,它是oclint指令的升级版,使用起来相对oclint指令简单方便。

可以通过 - 的方式在指令的最后加上oclint选项。

oclint-json-compilation-database指令有过滤文件选项

  • -i:包含进某些文件

  • -e:过滤掉某些文件

例如:

1
2
3
4
# 排除Pods 里的文件
oclint-json-compilation-database -e Pods 
# 包含进Pods里的文件
oclint-json-compilation-database -i Pods

oclint-xcodebuild指令。

因为oclint-xcodebuild指令已经不再维护,实际应用中用xcpretty代替,所以这里就不进行介绍。

其他命令工具:xcodebuild和xcpretty

xcodebuild联编

xcodebuild是苹果发布自动构造的工具,可以通过命令行脚本的方式编译,打包Xcode工程。

可以在终端输入man xcodebuild来查询相关用法



自定义规则

上面的命令中
-e Pods表示移除Pods文件夹里代码的分析,如果有继续-e Debug.m
-report-type html表示分析后输出的文件类型为HTML,查看其他支持的文件类型
-o oclint_result.html表示输出到oclint_result.html这个文件中()
-rc LONG_LINE=200表示每行最大字节长度为200(默认值为100,感觉在OC中100完全不够用啊)

一些常用规则的注释
# --命名
# 变量名字最长字节
#-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

oclint JSON的编译数据库命令手册
oclint命令手册
OCLint自定义规则介绍
OCLint规则全部介绍
文档里面有每个规则的演示和对应的命令名字,上面没介绍到的大家可以去文档查询


Warning❗️

(一)。xcodebuild联编命令不好用的时候,使用com + opt + shift + k状语从句:com + shift + k有80%的可能解决

(二)。 oclint: error: one compiler command contains multiple jobs:
解决方案:

1.如果电脑里面安装了两个Xcode的话可能会报上面错误,删掉其他只剩一个
xcode9以后(OCLint版本0.13,版本9.2 beta(9C34b)测试可用):
2.1更新到最新的oclintbrew upgrade oclint
2.2去github下载最新的oclint.sh替换掉旧的
3.试试手动将工程=> Build Settings=>搜索COMPILER_INDEX_STORE_ENABLE该配置设成NO
4.在podfile中添加:

post_install do |installer|

    installer.pods_project.targets.each do |target|

        target.build_configurations.each do |config|

            config.build_settings['COMPILER_INDEX_STORE_ENABLE'] = "NO"

        end

    end

end

在'==='中:US-ASCII中的无效字节序列

此时你需要在Xcode中的脚本的最前面,加上:

# 指定编码
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=
oclint规则索引

http://blog.csdn.net/liqinghuiyx/article/details/52471161

错误说明:https://www.jianshu.com/p/35cf99c07eaa

OCLint 0.10.3包含71条规则。
  1. 基本基本 
    1. 条件位运算BitwiseOperatorInConditional
    2. 错误空检查BrokenNullCheck
    3. 错误无检查BrokenNilCheck
    4. 特殊判断检查BrokenOddnessCheck
    5. 可以合并if语句CollapsibleIfStatements
    6. 恒定条件运算ConstantConditionalOperator
    7. IF条件恒定ConstantIfExpression
    8. 无效代码DeadCode
    9. 双重否定DoubleNegative
    10. 对于应该转换为ForLoopShouldBeWhileLoop
    11. Goto语句GotoStatement
    12. 混乱的增量JumbledIncrementer
    13. 错位的空检查MisplacedNullCheck
    14. 错位的无检查MisplacedNilCheck
    15. 多余运算符MultipleUnaryOperator
    16. 最后包含Return ReturnFromFinallyBlock
    17. Finally抛出异常 ThrowExceptionFromFinallyBlock
  2. Cocoa 
    1. 重写isEqual必须重写Hash MustOverrideHashWithIsEqual
    2. 必须调用超类 MustCallSuper
    3. 验证禁止引用 VerifyProhibitedCall
    4. 验证Protected方法 VerifyProtectedMethod
    5. 子类必须实现 SubclassMustImplement
  3. Convention 约定 
    1. 循环最后避免分支 AvoidBranchingStatementAsLastInLoop
    2. BaseClassDestructorShouldBeVirtualOrProtected
    3. 全覆盖的Switch不需要默认值CoveredSwitchStatementsDontNeedDefault
    4. default应该在Witch语句最后 DefaultLabelNotLastInSwitchStatement
    5. 虚拟类的析构函数 DestructorOfVirtualClass
    6. 逻辑倒置 InvertedLogic
    7. Switch语句缺少Break MissingBreakInSwitchStatement
    8. Switch中非case NonCaseLabelInSwitchStatement
    9. IvarAssignmentOutsideAccessorsOrInit
    10. 参数值重置 ParameterReassignment
    11. 使用短判断 UseEarlyExitsAndContinue
    12. Switch缺少Default SwitchStatementsShouldHaveDefault
    13. Switch分支语句太少 TooFewBranchesInSwitchStatement
  4. Design 设计 
    1. 避免虚拟方法的默认参数 AvoidDefaultArgumentsOnVirtualMethods
    2. 避免私有静态成员 AvoidPrivateStaticMembers
  5. Empty 空 
    1. 空Catch语句 EmptyCatchStatement
    2. 空Do While EmptyDoWhileStatement
    3. 空else语句 EmptyElseBlock
    4. 空Finally语句 EmptyFinallyStatement
    5. 空for语句 EmptyForStatement
    6. 空IF语句 EmptyIfStatement
    7. 空Switch EmptySwitchStatement
    8. 空Try语句 EmptyTryStatement
    9. 空While语句 EmptyWhileStatement
  6. Migration 
    1. ReplaceWithBoxedExpression
    2. ReplaceWithContainerLiteral
    3. ReplaceWithNumberLiteral
    4. ReplaceWithObjectSubscripting
  7. Naming 命名 
    1. 变量名过长 LongVariableName
    2. 变量名过短 ShortVariableName
  8. Redundant 沉余 
    1. 多余条件运算 RedundantConditionalOperator
    2. 多余IF语句 RedundantIfStatement
    3. 多余本地变量 RedundantLocalVariable
    4. 多余Nil检查 RedundantNilCheck
    5. 多余的Else语句 UnnecessaryElseStatement
    6. 释放内存时多余的Null检查 UnnecessaryNullCheckForDealloc
    7. 无用的括号UselessParentheses
  9. 尺寸大小 
    1. 高[圈复杂度] HighCyclomaticComplexity
    2. 类太长LongClass
    3. 行太长LongLine
    4. 方法太长LongMethod
    5. 高[有效代码行]方法HighNcssMethod
    6. 块嵌套太深DeepNestedBlock
    7. 高Npath复杂性HighNPathComplexity
    8. 字段太多TooManyFields
    9. 方法太多TooManyMethods
    10. 参数太多TooManyParameters
  10. 未使用无用 
    1. 无用本地变量UnusedLocalVariable
    2. 无用的方法参数UnusedMethodParameter

https://www.jianshu.com/p/3be0a519d6e2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值