我希望添加规范永远不会降低安全性,但这正是在以下情况下发生的情况。
在下面的代码中,Dialyzer(错误地)相信我 bar 的返回类型是1
. 这导致它说 foo() 中的模式永远无法匹配——不正确的建议,如果注意,会引入运行时错误!
-module(sample).
-export([foo/0]).
foo() ->
case bar() of
1 -> ok;
2 -> something
end.
-spec bar() -> 1.
bar() ->
rand:uniform(2).
删除规范以bar/0
解决问题——但为什么 Dialyzer 信任我?Dialyzer 在这里违反了它的“无误报”承诺:它在没有错误时发出警告。并且(更糟糕的是)Dialyzer 推动引入了一个新错误。