本文字数:22817字
预计阅读时间:58分钟
引言
随着App
功能不断增加,工程代码量也随之快速增加,依靠人工CodeReview
来保证项目的质量,越来越不现实,这时就有必要借助于自动化的代码审查工具,进行程序静态代码分析;提升自动化水平,提高团队研发效率。
程序静态代码分析(
Program Static Analysis
)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。—— 来自百度百科。
由于我们项目中Swift
代码占比较高,并且持续使用Swift
替换旧的Objc
代码,所以技术选型时,仅考虑Swift
语言,选用业界主流的静态代码分析工具SwiftLint
(https://github.com/realm/SwiftLint)。
本篇文章介绍了SwiftLint
的工作原理和配置文件的参数含义。同时还详细介绍了SwiftLint
内置规则的分类、如何理解规则说明以及如何禁用规则。此外,文章从工程实践的角度提供了一些实用的建议,并详细解释了如何添加自定义规则。最后,文章还提供了解决大项目改进耗时问题的方案。
SwiftLint简介
SwiftLint
是一个用于检查Swift
代码风格和诊断代码问题的工具。它通过Hook Clang
和SourceKit
来针对Swift
代码生成的AST(Abstract Syntax Tree)
抽象语法树,进行更精确分析,诊断源代码存在的问题。
工作原理
Swift
文件的编译过程:

Parse
(语法分析):语法分析器对Swift
源码进行逐字分析,生成不包含语义和类型信息的抽象语法树AST
。这个阶段生成的AST
也不包含警告和错误的注入;Sema
(语义分析):语义分析器会进行工作并生成一个通过类型检查的AST
,并且在源码中嵌入警告和错误等信息;SilLGen
(Swit
中间语言生成):Swit
中间语言生成 (SILGen
)阶段将通过语义分析生成的AST
转换为Raw SIL
, 再对Raw SIL
进行了一些优化(例如泛型特化,ARC
优化等)之后生成了Canonical siL
。slL
是Switt
定制的中间语言,针对Swift
进行了大量的优化,使得Swit
性能得到提升。SIL
也是Switt
编译器的精髓所在;IRGen
(生成LLVM
的中间语言):将SIL
降级为LLVM IR
,LLVM
的中间语言;LLVM
(LLVM
编译器架下的后端):前面几个阶段属于Swift
编译器,相当于OC
中的Clang
,属于LLVM
编译器架构下的前端,这里的LLVM
是编译器架构下的后端,对LLVM1R
进一步优化并生成目标文件 (.o
)。
AST
(Abstract Syntax Tree
抽象语法树) 是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,是Swift
文件编译过程中的产物。
Swiftc
生成AST
,Swiftc
是swift
语言的编译工具,它可以直接把.swift
文件编译生成可执行文件,也可以产生编译过程中某个中间文件。通过生成的 AST 信息可以看到import_decl
、class_decl
、var_decl
、func_decl
、brace_stmt
、call_expr
等及所在的行列数。SourceKit
可以通过这些信息实现语法高亮、排版、自动补全、跨语言头文件生成,等等....
SourceKit
是一套工具集,使得大多数 Swift
源代码层面的操作特性得以支持,例如源代码解析、语法高亮、排版(typesetting
)、自动补全、跨语言头文件生成,等等。
SwiftLint
的工作原理是检查Swift
代码编译过程中的AST
和SourceKit
环节,从而可以摆脱不同版本Swift
语法变化的影响。AST
是编译前端形成的抽象语法书(Abstract Symbolic Tree
),SourceKit
过程用来对AST
进行代码优化,减少内存开销,提高执行效率。
功能介绍
Swiftlint
本质上是一个命令行工具,它包含很多功能。
$ swiftlint help
OVERVIEW: A tool to enforce Swift style and conventions.
USAGE: swiftlint <subcommand>
OPTIONS:
--version Show the version.
-h, --help Show help information.
SUBCOMMANDS:
analyze Run analysis rules
docs Open SwiftLint documentation website in the default web browser
generate-docs Generates markdown documentation for all rules
lint (default) Print lint warnings and errors
rules Display the list of rules and their identifiers
version Display the current version of SwiftLint
See 'swiftlint help <subcommand>' for detailed help.
其中最常用的是两类功能:
按规则分析与检查代码
swiftlint //默认行为,按.swiftlint.yml配置文件中规则分析,打印警告和错误
自动修复代码
swiftlint --fix --config .swiftlint.auto.yml //根据配置文件指定规则修复文件
swiftlint
中只有部分规则支持自动修复,即当检查到代码中存在违反规则的问题,例如规则trailing_comma
,指数组末尾不应该加空格,let foo = [1, 2, 3,]
,数组中3后面逗号将会被自动去除,磁盘上的文件将被改写为更正的版本。建议请确保在运行swiftlint --fix
之前对这些文件进行了备份,否则可能会丢失重要数据。
配置文件
SwiftLint
通过配置文件.swiftlint.yml
,允许开发者定制规则的开启与关闭。
参数说明
首先了解一下配置文件中针对规则可设置的参数:
disabled_rules
: 关闭某些默认开启的规则。opt_in_rules
: 一些规则是可选的,添加到这里才会生效。only_rules
: 不可以和disabled_rules
或者opt_in_rules
并列。类似一个白名单,只有在这个列表中的规则才是开启的。analyzer_rules
:这是一个完全独立的规则列表,仅由analyze
命令运行。所有分析器规则都是可选择加入的,因此这是唯一可配置的规则列表,没有与disabled_rules only_rules
等价的规则。included
:指定需要检查的目录或文件excluded
:排除需要检查的目录或文件
disabled_rules: # rule identifiers&