2023-05-02 04:51:51
死代码是指代码库中不再被使用或无法访问的代码,判断和清理死代码可使用工具Hank,它能够检测并警告代码库中可删除或重构的代码,通过配置规则和运行命令即可实现自动化清理。
死代码的定义与影响
死代码指代码库中未被使用或无法访问的部分,可能包括未使用的函数、参数、宏、头文件或记录字段等。
死代码会增加代码维护成本、降低可读性,并可能隐藏潜在错误。
Hank工具的核心功能
检测死代码:Hank会分析代码库,标记未使用的函数、参数、宏、头文件等。
支持重构建议:不仅检测死代码,还提供重构建议(如删除未使用参数或合并头文件内容)。
项目级分析:与仅处理单个文件的工具(如Elvis)不同,Hank支持整个项目的分析。
源代码分析:无需编译代码即可分析,与依赖已编译代码的Xref形成对比。
规则可配置:用户可自定义规则或跳过特定规则(如开发中的库)。

Hank与其他工具的区别
与linter(如Elvis)的区别:Elvis专注于代码风格(如命名、行长度),而Hank专注于死代码检测。
与Xref的区别:Xref分析函数调用关系,但依赖已编译代码;Hank直接分析源代码。
与Dialyzer的区别:Dialyzer进行静态类型分析,而Hank不依赖规范或语义评估。
Hank的规则示例
unused_ignored_function_params:检测被忽略且未使用的函数参数,建议删除或重构。
single_use_hrls:若头文件仅被一个模块使用,建议将内容直接移入该模块。
single_use_hrl_attrs:若头文件中的宏或记录仅被一个模块使用,建议移至模块内。
unused_hrls:检测未被任何模块包含的头文件,建议删除。
unused_macros:检测未使用的宏,建议删除。
unused_record_fields:检测未使用的记录字段,建议删除以减小记录大小。
使用Hank的步骤
安装插件:在rebar.config中添加依赖:
{plugins, [rebar3_hank]}.运行分析:执行命令:
rebar3 hank查看结果:Hank会输出死代码位置及建议(如删除未使用参数或头文件)。
跳过规则的方法
模块级忽略:在模块中添加注释忽略规则:
-hank ignore. % 忽略所有规则-hank [single_use_hrl_attributes]. % 忽略特定规则配置文件忽略:在rebar.config中配置忽略规则:
{hank, [{ignore, [{"test/*.erl", unused_ignored_function_params}]}]}.Hank的可扩展性
用户可通过实现hank_rule行为自定义规则。
贡献新规则至GitHub社区,参与未解决议题的讨论。
Hank的实际效果
在Erlang/OTP项目中测试时,Hank检测到:
130多个包含未使用字段的记录。
1000多个未使用的宏。
2000多个函数带有未使用参数。
示例:发现http_uri.erl中某参数从未使用,提示需检查代码逻辑。

Hank通过自动化分析帮助开发者快速定位死代码,减少手动检查的工作量。
其规则覆盖多种死代码场景,且支持灵活配置和扩展,适合大型项目维护。
结合重构建议,Hank不仅能清理代码,还能提升代码质量和可维护性。