"熵",一个通常用于物理学描述系统混乱程度的术语,在软件开发中被借用来形容代码库随时间变得越来越难以管理和理解的过程。
deadcode("死代码") -- 在任何执行中都无法访问的函数 --成为了这种熵增的一部分。
本文旨在介绍一种对抗这类熵增的工具。
Deadcode工具简介
deadcode是Go官方在2023年12月推出的工具,可以帮助识别出一部分“死代码”,在重构(Clean Code)时,会比较有用。
工作原理
deadcode工具通过遍历整个Go项目的源码,通过golang的ssa转化为构建中间表示。再通过快速类型分析(Rapid Type Analysis, RTA),以main函数和init函数为入口,动态调用分析,构建出整个可访问的函数集。
RTA分析函数正文中的语句,收集三种信息: 直接调用的函数集; 它通过接口方法进行的动态调用集;转换为接口的类型集。对于接口和使用反射的方法,会稍微复杂一些。以main方法为入口,不断遍历,结合收集到所有的转化为接口的类型集,就能够标记出真正访问的接口方法,而不需要将所有的接口匹配类型的方法都标记为调用的目标。
局限
- 入口点是main函数和初始化函数,会导致无法对lib包直接使用,需要进行一些二次改造才可以适用
- 适用于识别函数级别的"死代码",无法识别例如变量级别的无用代码
- 不适用非Go代码和连接器函数
- 被识别出的"死代码",并不意味总是能直接删除,仍需要二次确认
安装&使用方法
使用比较简答,go install安装后,直接执行即可
# 安装
$ go install golang.org/x/tools/cmd/deadcode@latest
# 识别出以main为入口的死代码,识别出来后的死代码可以比较放心的删除
$ deadcode .
# 识别出未被_test.go覆盖的死代码,也就是未被单元测试覆盖的方法,可用于提高单测覆盖率
$ deadcode -test .
一些自动化
使用deadcode工具的步骤为:
- 执行deadcode工具识别出标识为"死代码"的function
- 删除这些function
- 删除受影响的import package
- 找出并删除受影响的单元测试
- 删除空文件和空目录等
以上步骤,可以通过整合不同的代码扫描工具来实现自动化: 通过go ast删除掉"死代码"的function,然后goimports删掉没有用的import package,使用静态扫描工具找出_test.go中undefined function,然后删掉有undefined报错的单测,删除空文件和空目录。 以上所有步骤我们已实现自动化工具进行删除,待有时间我们会进行开源,欢迎关注~
以上是我在公司宣传的质量内建系列的第六期内容。
后续的每一期内容我都会及时发布在掘金的工程师质量文化专栏,欢迎大家关注,共同进步。 若需要原始海报资料,可以在文章下边评论留言,或是私信我获取。
最后,照例给大家看下我们在公司张贴的海报吧~