SuperAPI AI 工具集

dialyzer-analysis

编程与开发

查看项目

更新于 10-16 04:08

技能介绍

Dialyzer Analysis 是一份面向 Erlang 与 Elixir 代码的 Dialyzer 警告分析与修复指南。

用途 该技能用于理解和修复 Erlang/Elixir 代码中的 Dialyzer 警告。它聚焦于类型规格编写与类型偏差排查,帮助开发者在引入类型规格后减少警告并修正类型不一致。

主要能力

  1. 类型规格(Type Specifications)编写:涵盖基础规格(如 @spec add(integer(), integer()) :: integer()、@spec get_user(pos_integer()) :: {:ok, User.t()} | {:error, atom()})、复杂类型(如 @type user :: %{...})、泛型类型(如 @spec map_values(map(), (any() -> any())) :: map()、@spec filter_list([t], (t -> boolean())) :: [t] when t: any())。
  2. 常见警告的识别与修复:包括模式匹配覆盖不完整(pattern match is not exhaustive)、无本地返回(function has no local return)、未匹配的返回值(unmatched return)、未知函数(unknown function)四类。示例给出了各自的触发写法与修复写法,例如补全 case 分支、用 @spec always_raises :: no_return() 标注、用 case 处理返回值、以及通过 Code.ensure_loaded? 与 function_exported? 做动态检查。
  3. 类型分析模式:介绍联合类型(@type result :: :ok | {:ok, any()} | {:error, String.t()} 及对应的多子句处理)、不透明类型(@opaque internal_state :: %{data: map(), timestamp: integer()})、远程类型(如 Plug.Conn.t()、Date.t())。

成功类型(Success Typing) Dialyzer 使用成功类型:它近似推断函数“能够成功返回什么”,与传统类型系统不同,理论上可能漏掉部分错误,但不会产生误报。文档以 def double(x), do: x * 2 为例,说明 Dialyzer 会推断出 integer() -> integer(),如需更精确可配合 @spec 与守卫。

使用方式 文档给出了调试命令:mix dialyzer --format dialyzer 输出详细结果、mix dialyzer --explain 解释警告、mix dialyzer lib/my_module.ex 检查指定文件。

适用场景 适用于维护 Erlang/Elixir 项目、为公开 API 补充类型规格、排查 Dialyzer 警告以及理解成功类型推断行为的场景。

最佳实践 先为核心模块添加规格,从公开 API 开始;优先使用具体类型而非 any();用规格记录假设与预期行为;确保规格与实际行为一致;逐步迭代地修复警告。

限制 文档未提供关于运行环境版本、性能开销、与具体构建工具集成的完整细节,也未提供收费、价格或平台相关信息;这些内容暂未提供。