Dialyzer警告no_exit在糟糕的记录构建上-这是一个错误吗



当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(无论好坏!(缓慢前进,愉快地将原子"未定义"分配给任何统一的字段。

澄清:我在这里的意思是,在可行的情况下,静态检查最好反映Erlang在运行时的工作方式。

这是Dialyzer的错误吗?

Dialyzer处理这些错误初始化的记录的方式是有害的,因为它可能会触发一连串的虚假警告——当Dialyzer认为函数行foo不可访问时,任何只能从foo访问的函数也会被视为无效。

不,这不是一个bug。

我认为这是一个限制,因为Erlang是动态类型的,并且-type指令在运行时不使用。

Dialyzer是建立在ERTS之上的,而不是相反。

这种情况下的问题是透析器不知道如何继续执行:它应该使用记录定义中定义的类型还是实际的记录初始化?它会报告一个错误,而实际的修复则留给程序员。

相关内容

  • 没有找到相关文章

最新更新