Dialyzer 警告关于 no_exit 错误记录构建 - 这是一个错误吗?
Dialyzer warns about no_exit on bad record construction - is this a bug?
当 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(无论好坏!)都在运行,愉快地将原子 'undefined' 分配给到任何单元化字段。
澄清:我在这里的意思是,在可行的情况下,最好让静态检查反映 Erlang 在 运行 时的工作方式。
这是 Dialyzer 的错误吗?
Dialyzer 处理这些未正确初始化的记录的方式是有害的,因为它可以触发一连串的虚假警告——当 Dialyzer 认为函数行 foo
不可访问时,任何只能从 foo
也算死了。
不,这不是错误。
我会说这是一个限制,因为 Erlang 是动态类型的,并且 -type
指令在运行时不使用。
Dialyzer 建立在 ERTS 之上,而不是相反。
这种情况下的问题是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(无论好坏!)都在运行,愉快地将原子 'undefined' 分配给到任何单元化字段。
澄清:我在这里的意思是,在可行的情况下,最好让静态检查反映 Erlang 在 运行 时的工作方式。
这是 Dialyzer 的错误吗?
Dialyzer 处理这些未正确初始化的记录的方式是有害的,因为它可以触发一连串的虚假警告——当 Dialyzer 认为函数行 foo
不可访问时,任何只能从 foo
也算死了。
不,这不是错误。
我会说这是一个限制,因为 Erlang 是动态类型的,并且 -type
指令在运行时不使用。
Dialyzer 建立在 ERTS 之上,而不是相反。
这种情况下的问题是dialyzer不知道如何继续执行:它应该使用记录定义中定义的类型还是实际记录初始化?它报告错误,实际修复留给程序员。