当 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 认为某行函数foo
不可访问时,任何只能从 from 可访问的函数foo
也被视为已死。