【问题标题】:Understanding dialyzer result了解透析器结果
【发布时间】:2016-12-13 19:35:55
【问题描述】:

我有以下功能:

-spec check_connection_header(list()) -> atom().
check_connection_header([{<<"Connection">>, <<"close">>}|_]) ->
    close;

check_connection_header([{<<"Connection">>, <<"Close">>}|_]) ->
    close;

check_connection_header([{<<"connection">>, <<"close">>}|_]) ->
    close;

check_connection_header([{<<"connection">>, <<"Close">>}|_]) ->
    close;

check_connection_header([_|Rest]) ->
    check_connection_header(Rest);

check_connection_header([])->
    keep_alive.

当我运行透析器时,我得到以下输出:

131: The pattern [{<<67:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<99:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 134: The pattern [{<<67:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<67:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 137: The pattern [{<<99:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<99:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 140: The pattern [{<<99:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1,110:8/integer-unit:1,101:8/integer-unit:1,99:8/integer-unit:1,116:8/integer-unit:1,105:8/integer-unit:1,111:8/integer-unit:1,110:8/integer-unit:1>>, <<67:8/integer-unit:1,108:8/integer-unit:1,111:8/integer-unit:1,115:8/integer-unit:1,101:8/integer-unit:1>>} | _] can never match the type []
 143: The pattern [_ | Rest] can never match the type []

我对透析器很陌生,无法解释透析器的输出。我理解是说函数的前 5 个子句不能匹配 [],但这是我故意的,因为我匹配的是第六个子句中的空列表。

我的 erlang 版本是 Erlang/OTP 19.0,我的透析器版本是 v3.0。

一个有趣的发现是,当我在另一台机器上运行 dialyzer v2.8 和 Erlang/OTP 18 时,dialyzer 不会抱怨上面的代码。

到目前为止我尝试过的事情:

  • 我对 erlang 中的二进制文件不是很有经验,所以我最初的想法是我误解了二进制模式匹配,但事实似乎并非如此。该函数通过了我的测试用例(使用 [] 作为参数调用该函数没问题),而且如果我在函数头中用普通字符串替换二进制文件,我也会收到同样的透析器抱怨。

  • 重建plt并清理项目

提前致谢

【问题讨论】:

  • 我无法在仅使用 rebar3 new apprebar3 dialyzer 的新项目中使用 Erlang/OTP 19 和 Dialyzer 3.0.1 重现此错误。你执行了哪些命令来运行透析器?
  • 我正在使用rebar3 dialyzer,只需将函数添加到rebar3 new app 骨架项目即可重现。此外,在使用 travisCI 和与本地计算机上相同的透析器/erlangOTP 版本运行时,我从透析器收到相同的警告。
  • 这很奇怪。如果我将类型签名更改为list() -&gt; list(),我会收到来自rebar3 dialyzer 的警告:Invalid type specification for function r_app:check_connection_header/1. The success typing is (maybe_improper_list()) -&gt; 'close' | 'keep_alive'。我在 Erlang 19.0.2 和 Dialyzer 3.0.1 上。
  • 我找到了问题的原因,看我的回答。感谢您的帮助!

标签: erlang dialyzer


【解决方案1】:

透析器警告的原因是由于我的代码存在缺陷,该函数总是以空列表 ([]) 调用。

因此得出结论:这次透析器也没有错:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多