iOS 开发 学习

iOS静态分析:OCLint的使用

2020-05-06  本文已影响0人  张聪_2048

前言

OCLint是基于 Clang Tooling 开发的静态分析工具,主要用来发现编译器检查不到的那些潜在的关键技术问题。2017 年 9 月份新发布的 OCLint 0.13 版本中,包含了 71 条规则。这些规则已经基本覆盖了具有通用性的规则,主要包括语法上的基础规则、Cocoa 库相关规则、一些约定俗成的规则、各种空语句检查、是否按新语法改写的检查、命名上长变量名短变量名检查、无用的语句变量和参数的检查。

除此之外,还包括了和代码量大小是否合理相关的一些规则,比如过大的类、类里方法是否太多、参数是否过多、Block 嵌套是否太深、方法里代码是否过多、圈复杂度的检查等。你可以在官方规则索引中,查看完整的规则说明。这些规则可以在运行时被动态地加载到系统中,规则配置灵活、可扩展性好、方便自定义。

OCLint是一个通过检查C,C++或Objective-C代码来提高代码质量、降低错误率的静态代码分析工具,代码通过OCLint检测后,可以发现一些潜在的问题,如:

* 可能的bug:if/else/try/catch/finally 空语句空变量
* 代码无用:并未使用的本地变量和参数
* 代码过于复杂:高复杂度的循环、判断
* 代码冗余:冗余的if判断和多余的括号
* 代码异味:长的方法和长参数列表
* 不好的尝试:反向逻辑、参数重复赋值

静态代码分析是一个很重要的技术发现编译器中那些不可视的缺点,OCLint自动完成这些检测需要依赖以下特点:

* 依赖源代码的抽象语法树来保证精准度和效率,尽可能减少误报,避免有用的结果被跳过;
* 动态加载规则到系统中(甚至是运行期间加载规则);
* 灵活可扩展的配置保证用户可以定制化静态代码检查工具;
* 为了技术问题尽早的被修复,降低维护成本,使用命令行运行命令,在代码开发过程中,对代码进行持续集成和检测;

一、OCLint的安装

1、安装OCLint

有三种方式安装,分别为 Homebrew下载安装包安装源代码编译安装。 建议先使用Homebrew方式安装,更简单方便些。它们的区别为:

* 如果需要自定义 Lint 规则,则需要下载源码编译安装
* 如果仅仅是使用自带的规则来 Lint,那么以上3种安装方式都可以

1)Homebrew 安装 (推荐)

在安装前,确保安装了 homebrew。然后先执行brew命令安装第三方依赖库-oclint/formulae,之后再安装oclint,具体两个指令如下:

brew tap oclint/formulae
brew install oclint

安装正常完成,即证明OCLint安装成功。

2)下载安装包安装

OCLint_PATH=/Users/zjh48/Documents/oclint/build/oclint-release
export PATH=$OCLint_PATH/bin:$PATH
source .bash_profile

2、安装xcodebuild

xcodebuild是xcode的编译命令,xcode 下载安装好就已经成功安装了,无需额外安装

3、安装xcpretty

需要使用OCLint对日志信息进行分析运行命令,安装xcpretty,使用xcpretty命令分析日志信息。xcpretty是用来格式化xcodebuild输出的工具,使用ruby开发。安装:

gem install xcpretty

二、OCLint命令行使用

1、进入指定项目

cd /Users/zjh48/Desktop/ZJHAnalyzeDemo

2、查看项目基本信息

xcodebuild -list

打印输出

Information about project "ZJHAnalyzeDemo":
    Targets:
        ZJHAnalyzeDemo

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    Schemes:
        ZJHAnalyzeDemo

3、编译项目

先clean指定项目ZJHAnalyzeDemo,因为集成了pod,所以使用ZJHAnalyzeDemo.xcworkspace;然后再Debug 编译项目了;最后通过xcpretty,使用 -r json-compilation-database 可以生成指定格式的数据。编译成功后,会在项目的文件夹下出现 compile_commands.json 文件

xcodebuild -scheme ZJHAnalyzeDemo -workspace ZJHAnalyzeDemo.xcworkspace clean && xcodebuild -scheme ZJHAnalyzeDemo -workspace ZJHAnalyzeDemo.xcworkspace -configuration Debug | xcpretty -r json-compilation-database -o compile_commands.json

注意项

4、生成 html 报表

 oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html
oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html 2>&1 | tee 1.log
oclint-json-compilation-database -i 需要静态分析的文件夹或文件 -- -report-type html -o oclintReport.html  其他的参数
查看 oclintReport.html 文件.png

5、可能遇到的问题

1)报错:oclint: error: one compiler command contains multiple jobs

报错信息是:oclint: error: one compiler command contains multiple jobs: 查找资料:https://github.com/oclint/oclint/issues/462 解决方案如下

COMPILER_INDEX_STORE_ENABLE 设置为 NO.png
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
在 podfile 中 target 'xx' do 前面添加下面的脚本.png

2)报错:oclint: error: violations exceed threshold

看到报错信息是默认的警告数量超过限制,则 lint 失败。事实上 lint 后可以跟参数,所以我们修改脚本如下

oclint-json-compilation-database -e Pods -- -report-type html -o oclintReport.html -rc LONG_LINE=9999 -max-priority-1=9999 -max-priority-2=9999 -max-priority-3=9999

6、OCLint的规则

1)可以通过 -e 参数忽略指定的文件,比如忽略Pods文件夹:
oclint-json-compilation-database -e Pods -- -o=report.html
2)通过-rc改变检查规则的默认值

比如有一条默认规则:long line [size|P3] Line with 137 characters exceeds limit of 100 ,这表示一个方法里的代码行数不能超过100,可以通过-rc改变默认100行的限制比如改成200行

oclint-json-compilation-database -- -rc=LONG_LINE=200 -o=report.html

具体可以操作哪些规则,可以去官网查询

3)通过 -disable-rule可以禁止某一规则,比如禁止LongLine长方法检查:
oclint-json-compilation-database -disable-rule=LongLine
4)这些命令是可以组合使用,比如:
oclint-json-compilation-database -e Pods -rc=LONG_LINE=200-- -o=report.html
5)如果需要更改的规则比较多,可以通过.oclint 文件配置规则
具体编写规则.jpg

三、Xcode脚本使用

1、创建Aggregate项目

OClint 可以和 Xcode IDE 结合,把错误直接在 IDE 中显示出来。首先,我们在项目中创建一个新的 target,然后选择 Aggregate 作为模板。在项目的 TARGETS 下面,点击下方的 "+" ,选择 cross-platform 下面的 Aggregate。输入自定义名字,这里命名为 ZJHLint。注意我们可以建立多个 target,然后分别关注代码分析的多个方面。

创建Aggregate项目.png

2、添加 Run Script 脚本

选择对应的 TARGET -> ZJHLint。然后在 Build Phases 选项卡中选择 Add Run Script。

添加 Run Script 脚本.png

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

cd ${SRCROOT}
xcodebuild -scheme ZJHAnalyzeDemo -workspace ZJHAnalyzeDemo.xcworkspace clean && xcodebuild -scheme ZJHAnalyzeDemo -workspace ZJHAnalyzeDemo.xcworkspace -configuration Debug | xcpretty -r json-compilation-database -o compile_commands.json && oclint-json-compilation-database -e Pods -- -report-type Xcode

3、运行Aggregate项目

然后我们就可以开始执行分析了,因为这里我们选择的 report-type 是 xcode,这时 oclint 发现的错误会直接在 IDE 中标示出来,方便我们对代码进行改进。当然这只是一种参考,不一定要采纳 oclint 给的提示。(我这边在Xcode运行脚本时,识别不出 xcpretty 指令,搜索了好久,还是没找到原因,这里先用了别人的截图)

lint 给的提示.png



参考链接:
OCLint 实现 Code Review - 给你的代码提提质量
OCLint在Xcode中的使用
iOS使用OCLint静态代码分析+jenkins集成
Jenkins+oclint集成iOS代码静态分析

上一篇下一篇

猜你喜欢

热点阅读