iOS Code Review - Objective-C代码静态分析

Code Review

代码评审,代码静态检查,Objective-C代码静态检查工具——OCLint

Github: https://github.com/bobwongs/BWCodeReview

Contents

  • Overview
  • OCLint
    • 给Xcode项目集成OCLint
      • 1、安装
      • 2、配置
      • 3、静态代码分析
    • OCLint已有规则的自定义
  • Summary
  • Next
  • Reference
  • Follow Me

Overview

  • 编写符合项目团队规范的代码
  • 检查和提高项目代码质量
  • 提高项目的可维护性
  • 弥补由Xcode原本的代码检查所不能检查到的问题代码的不足,让代码保持更高质量

OCLint

对C、C++、Objective-C进行静态代码检查的工具

给Xcode项目集成OCLint

1、安装

必要的工具:OCLint、xcpretty(美化xcodebuild的命令行输出日志工具)

选择性安装:Homebrew(The missing package manager for macOS,Mac OS的包管理器,可以便捷地安装很多常用的工具)

资源下载地址

OCLint:https://github.com/oclint/oclint/releases,选择最新的版本进行下载

xcpretty:https://github.com/supermarin/xcpretty,安装命令:gem install xcpretty,首先要安装有gem

Homebrew:https://brew.sh/,安装命令:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

OCLint的安装

Reference:http://docs.oclint.org/en/stable/intro/installation.html

1、解压OCLint安装包,打开终端,切换到解压出来的OCLint安装包目录

code_review_install_resource
code_review_execute_cp_command

2、执行脚本

OCLINT_HOME=/path/to/oclint-release
export PATH=$OCLINT_HOME/bin:$PATH
cp bin/oclint* /usr/local/bin/
cp -rp lib/* /usr/local/lib/

3、安装结果的验证,终端输入oclint,输出如下结果为安装成功

$ oclint
oclint: Not enough positional command line arguments specified!
Must specify at least 1 positional arguments: See: oclint -help

另外,也可以用Homebrew进行安装和更新

安装

brew tap oclint/formulae
brew install oclint

更新

brew update
brew upgrade oclint

2、配置

在项目根目录下创建用于分析的Shell脚本文件analysis.sh
code_review_project_directory_analysis

以下为analysis.sh文件内的脚本

# 移除原有的生成文件
xcodebuild clean | xcpretty
rm -r build
rm -r compile_commands.json

# Build和把日志写到目标文件
xcodebuild | xcpretty -r json-compilation-database --output compile_commands.json

Reference

http://docs.oclint.org/en/stable/guide/xcode.html

https://gist.github.com/ryuichis/755e6297aec13c900cdf

Xcode -> Build Phases -> New Run Script Phase -> Run Script,配置生成代码不规范相关警告的Shell脚本
code_review_run_script
oclint-json-compilation-database -- -report-type xcode

说明:如果要在项目源码中进行代码检查,那么在检查的时候才开启上述Xcode里面配置的脚本,不需要进行检查,打包测试,提交到Git上的时候记得把检查脚本注释掉,不然在Build之前都会先执行分析脚本,看具体情况对这段代码进行注释或者开启

3、静态代码分析

在命令行切换到项目根目录,运行analysis.sh,生成build目录和用于生成警告的compile_commands.json文件
code_review_execute_analysis_shell
code_review_execute_analysis_shell_result_file

如果项目中有.xcworkspace,则在使用xcodebuild命令,没有指定相应的参数时是会失败的,但是没关系,只要能确保命令行的输出里面看到有compile的字眼就OK,因为OCLint的原理就是从compile的源文件中去检查的

如下图所示,即使是Build Failed,也是没问题的,也同样能生成供OCLint进行静态代码检查的文件

code_review_execute_analysis_shell_workspace
对Xcode项目进行Command+B操作,等oclint命令对compile_commands.json文件分析完成,就能查看到由于编码不规范生成的警告
code_review_analysis_result_warning

OCLint已有规则的自定义

Reference

OCLint查看帮助命令:oclint -help

OCLint代码静态检查规则的查看命令:oclint rt -list-enabled-rules

OCLint configuration file:http://docs.oclint.org/en/stable/howto/rcfile.html

Project Configuration File

仅针对单个项目的已有规则的自定义,在项目根目录下创建.oclint文件,可以使用Shell命令快速创建

code_review_oclint_file_location
touch .oclint # 创建.oclint文件

.oclint文件自定义已有规则

示例一

关闭已有的一些检查规则

查看已有检查规则的命令:oclint rt -list-enabled-rules

disable-rules:
  - LongLine
  - LongVariableName
  - UnusedMethodParameter
示例二

自定义已有规则的限值,例如单行字数的上限

Reference:http://docs.oclint.org/en/stable/howto/thresholds.html

disable-rules:
  - LongLine
rulePaths:
  - /etc/rules
rule-configurations:
  - key: CYCLOMATIC_COMPLEXITY
    value: 15
  - key: LONG_LINE
    value: 200
output: oclint.xml
report-type: xml
max-priority-1: 20
max-priority-2: 40
max-priority-3: 60
enable-clang-static-analyzer: false

Summary

  • 对项目代码质量进行周期性检查
  • 及时修改不符合规范的代码
  • 让项目问题杜绝在代码编写的层面

Next

  • 自定义OCLint的检查规则
  • Code Review的规范
  • Objective-C编码规范
  • Swift编码规范

Reference

OCLint

Follow Me

Github: https://github.com/bobwongs

Sina: http://weibo.com/bobwongs

欢迎打赏!

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

推荐阅读更多精彩内容