erlang - Dialyzer 在不良记录构建时警告 no_exit - 这是一个错误吗?

标签 erlang dialyzer

当 Dialyzer 遇到未初始化所需字段的记录文字时,它认为控制流在记录文字所在的行处停止。
例子:

-module(sample).
-export([foo/0]).
-record(boo, {a :: number()}).
foo() ->
    erlang:display(#boo{}).
错误:
13> dialyzer:run([{files, ["/Users/mheiber/sample.erl"]}, {from, src_code}]).
[{warn_return_no_exit,
     {"/Users/mheiber/sample.erl",11},
     {no_return,[only_normal,foo,0]}},
 {warn_matching,
     {"/Users/mheiber/sample.erl",12},
     {record_constr,
         ["#boo{a::'undefined'}","a::number()"]}}]
这是一个错误吗? Erlang 的运行时语义与 Dialyzer 对它们建模的方式不匹配:ERTS(无论好坏!)不断前进,愉快地将原子“未定义”分配给任何未定义的字段。
澄清:我的意思是,在可行的情况下,最好让静态检查反射(reflect) Erlang 在运行时的工作方式。
那么这是一个透析器错误吗?
Dialyzer 处理这些未正确初始化的记录的方式是有害的,因为当 Dialyzer 想到函数foo 时,它会触发一连串虚假警告。是无法访问的,任何只能从 foo 访问的函数也算死了。

最佳答案

不,这不是错误。
我会说这是由 Erlang 是动态类型的事实和 -type 引起的限制。在运行时不使用指令。
透析器建立在 ERTS 之上,而不是相反。
这种情况下的问题是dialyzer不知道如何继续执行:它应该使用记录定义中定义的类型还是实际的记录初始化?它报告一个错误,实际的修复留给程序员。

关于erlang - Dialyzer 在不良记录构建时警告 no_exit - 这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65426213/

相关文章:

string - 如何在 Erlang 中将重音字符串转换为常规字符串?

Erlang 中的 Java SocketChannel 等效项

erlang - 转换到 `any()` 是让 Dialyzer 接受 ETS 匹配模式的好解决方案吗?

erlang - 为什么 Dialyzer 无法捕获这个简单的错误?

erlang - 为什么 Dialyzer 没有发现这段代码错误?

null - 是否有 erlang null 语句

erlang - ejabberd 可以安装在 Google Compute Engine 上吗?

erlang - 在 Erlang 中如何求模或求余?

elixir - "dialyzer: Analysis failed with error.."(透析器错误?或错误使用 map 类型?)

elixir - 关于 Gettext 模块上的 pattern_match_cov 的透析器警告