Swift静态代码检测工程实践

SwiftLint是一款用于检查Swift代码风格和问题的工具,通过AST和SourceKit进行分析。文章详细介绍了SwiftLint的工作原理、配置文件参数、内置规则、自定义规则以及如何在工程实践中优化使用,帮助提升代码质量和团队效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c4055ce177c254f0a0714875ad211b7e.gif

本文字数:22817

预计阅读时间:58分钟

引言

随着App功能不断增加,工程代码量也随之快速增加,依靠人工CodeReview来保证项目的质量,越来越不现实,这时就有必要借助于自动化的代码审查工具,进行程序静态代码分析;提升自动化水平,提高团队研发效率。

程序静态代码分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。—— 来自百度百科

由于我们项目中Swift代码占比较高,并且持续使用Swift替换旧的Objc代码,所以技术选型时,仅考虑Swift语言,选用业界主流的静态代码分析工具SwiftLint(https://github.com/realm/SwiftLint)。

本篇文章介绍了SwiftLint的工作原理和配置文件的参数含义。同时还详细介绍了SwiftLint内置规则的分类、如何理解规则说明以及如何禁用规则。此外,文章从工程实践的角度提供了一些实用的建议,并详细解释了如何添加自定义规则。最后,文章还提供了解决大项目改进耗时问题的方案。

SwiftLint简介

SwiftLint是一个用于检查Swift代码风格和诊断代码问题的工具。它通过Hook ClangSourceKit来针对Swift代码生成的AST(Abstract Syntax Tree)抽象语法树,进行更精确分析,诊断源代码存在的问题。

工作原理

Swift文件的编译过程:

b27cd4449358328444c5c7144ddba5b1.png
  • Parse(语法分析):语法分析器对Swift源码进行逐字分析,生成不包含语义和类型信息的抽象语法树AST。这个阶段生成的AST也不包含警告和错误的注入;

  • Sema(语义分析):语义分析器会进行工作并生成一个通过类型检查的AST,并且在源码中嵌入警告和错误等信息;

  • SilLGen(Swit中间语言生成):Swit中间语言生成 (SILGen)阶段将通过语义分析生成的AST转换为Raw SIL, 再对Raw SIL进行了一些优化(例如泛型特化,ARC优化等)之后生成了Canonical siLslLSwitt定制的中间语言,针对Swift进行了大量的优化,使得Swit性能得到提升。SIL也是Switt编译器的精髓所在;

  • IRGen(生成LLVM的中间语言):将SIL降级为LLVM IRLLVM的中间语言;

  • LLVM(LLVM编译器架下的后端):前面几个阶段属于Swift编译器,相当于OC中的Clang,属于LLVM编译器架构下的前端,这里的LLVM是编译器架构下的后端,对LLVM1R进一步优化并生成目标文件 (.o)。

AST(Abstract Syntax Tree 抽象语法树) 是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,是Swift 文件编译过程中的产物。

Swiftc生成ASTSwiftcswift语言的编译工具,它可以直接把.swift文件编译生成可执行文件,也可以产生编译过程中某个中间文件。通过生成的 AST 信息可以看到import_declclass_declvar_declfunc_declbrace_stmtcall_expr等及所在的行列数。SourceKit可以通过这些信息实现语法高亮、排版、自动补全、跨语言头文件生成,等等....

SourceKit 是一套工具集,使得大多数 Swift 源代码层面的操作特性得以支持,例如源代码解析、语法高亮、排版(typesetting)、自动补全、跨语言头文件生成,等等。

SwiftLint 的工作原理是检查Swift代码编译过程中的ASTSourceKit环节,从而可以摆脱不同版本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&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值