erlang 透析器警告关于错误记录构建的no_exit-这是一个漏洞吗?

yshpjwxd  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(169)

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

a64a0gku

a64a0gku1#

不,不是窃听器。
我认为这是由于Erlang是动态类型化的,并且在运行时不使用-type指令这一事实造成的限制。
透析器构建在Erts之上,而不是相反。
这种情况下的问题是透析器不知道如何继续执行:它应该使用记录定义中定义的类型还是实际的记录初始化?它报告错误,实际的修复留给程序员。

相关问题