[erlang-questions] Warning not emitted on string matching clauses

Anthony Ramine n.oxyde@REDACTED
Wed Apr 8 09:52:29 CEST 2015


Le 8 avr. 2015 à 08:46, Erik Søe Sørensen <eriksoe@REDACTED> a écrit :

> It would of course make sense to have the compiler warn in this case.
> However - if my understanding of the compiler implementation is correct - matching of binaries is handled specially, and apparently in such a manner that it doesn't realise that the two binary patterns are identical.
> /Erik

That would be a reasonable explanation, but unfortunately it's not the case. If you compile that module to BEAM assembly, you can see very that the two patterns are indeed merged together, there is only one occurrence of "user_auth" in it.

{function, authenticate_nouns, 1, 2}.
  {label,1}.
    {line,[{location,"wat_clauses.erl",3}]}.
    {func_info,{atom,wat_clauses},{atom,authenticate_nouns},1}.
  {label,2}.
    {test,is_nonempty_list,{f,4},[{x,0}]}.
    {get_list,{x,0},{x,1},{x,2}}.
    {test,is_tuple,{f,4},[{x,1}]}.
    {test,test_arity,{f,4},[{x,1},2]}.
    {get_tuple_element,{x,1},0,{x,3}}.
    {get_tuple_element,{x,1},1,{x,4}}.
    {test,bs_start_match2,{f,4},5,[{x,3},0],{x,5}}.
    {test,bs_match_string,{f,4},[{x,5},72,{string,"user_auth"}]}.
    {test,bs_test_tail2,{f,4},[{x,5},0]}.
    {test,is_nil,{f,3},[{x,2}]}.
    {move,{atom,true},{x,0}}.
    return.
  {label,3}.
    {test,is_nonempty_list,{f,4},[{x,4}]}.
    {get_list,{x,4},{x,6},{x,7}}.
    {test,bs_start_match2,{f,4},8,[{x,6},0],{x,8}}.
    {test,bs_match_string,{f,4},[{x,8},64,{string,"recovery"}]}.
    {test,bs_test_tail2,{f,4},[{x,8},0]}.
    {test,is_nil,{f,4},[{x,7}]}.
    {test,is_nil,{f,4},[{x,2}]}.
    {move,{atom,hi},{x,0}}.
    return.
  {label,4}.
    {move,{atom,false},{x,0}}.
    return.




More information about the erlang-questions mailing list