2

私は次の機能を持っています:

-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 つの句が [] に一致しないと言っているのは理解していますが、6 番目の句で空のリストを一致させているため、これは私の意図によるものです。

私の erlang のバージョンは Erlang/OTP 19.0 で、ダイアライザーのバージョンは v3.0 です。

興味深い発見は、dialyzer v2.8 と Erlang/OTP 18 を別のマシンで実行したときに、dialyzer が上記のコードについて文句を言わないことです。

私がこれまでに試したこと:

  • 私は erlang のバイナリの経験があまりないので、最初はバイナリ パターン マッチングを誤解していたのではないかと思いましたが、そうではないようです。関数は私のテスト ケースに合格します (パラメーターとして [] を使用して関数を呼び出すことは問題ありません)。また、関数の先頭でバイナリを通常の文字列に置き換えると、ダイアライザーから同じ苦情が発生します。

  • plt を再構築し、プロジェクトをクリーンアップしました

前もって感謝します

4

1 に答える 1

9

[]ダイアライザーの警告の理由は、コードの欠陥により、関数が常に空のリスト ( ) で呼び出されたためです。

結論として、今回もダイアライザーは間違っていませんでした:)

于 2016-08-08T09:21:01.340 に答える