[erlang-questions] Why does Dialyzer crash on this map?

Ali Sabil <>
Fri Mar 13 11:20:42 CET 2015


Has this been solved for 17.4? I am getting the same crash on a quite large
code base using 17.4.1

Thanks,
Ali

On Thu, Nov 27, 2014 at 10:05 PM, Ivan Uemlianin <> wrote:

> Dear Björn-Egil
>
> Thanks very much for your work and for reporting back. It looks like good
> news (for me and for 18 at least).
>
> Best wishes
>
> Ivan
>
> --
> festina lente
>
>
> On 27 Nov 2014, at 20:52, Björn-Egil Dahlberg <
> > wrote:
>
> Looks like the regression was introduced in
> 'hb/dialyzer/fix_recognition_of_records/OTP-11935'
> (805f9c89fc01220bc1bb0f27e1b68fd4eca688ba) included from OTP 17.1
>
> This becomes a none-issue in the master branch (for 18) since variables
> are allowed as keys there but it needs to be solved for the 17 track.
>
>
> 2014-11-27 21:13 GMT+01:00 Björn-Egil Dahlberg <
> >:
>
>> I managed to reproduce your errors on dt.erl and dt2.erl using OTP-17.3.3
>> tag.
>>
>> Seems like I've missed something in dataflow .. looks like a clause
>> missing for the map type.
>> I'm not well versed in dialyzer. Hopefully I can do a fix for it for 17.4.
>>
>> There are a bit more stuff going on here too. When dialyzer uses the
>> erlang compiler to compile to core
>> it does not coalesce things to literals but keeps them abstract instead
>> ..
>> Compound keys such as [1,2,3] and {4,5,6} will thus become non-literals
>> (variables) and such keys are not allowed in maps.
>>
>> I need to ponder that a bit before I try to solve it.
>>
>> // Björn-Egil
>>
>> 2014-11-27 13:20 GMT+01:00 Ivan Uemlianin <>:
>>
>>> Dear Dave
>>>
>>> Thanks for your help.  Here are some more details:
>>>
>>>
>>> *** OS: FreeBSD 10.0-RELEASE
>>>
>>> $ uname -a
>>> FreeBSD simba 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16
>>> 22:34:59 UTC 2014 :/usr/obj/usr/src/sys/GENERIC
>>> amd64
>>>
>>> Upgrading to 10.1 is on my todo list.
>>>
>>>
>>> *** Erlang version now 17.3_3,3
>>>
>>> $ pkg info erlang
>>> erlang-17.3_1,3
>>> ...
>>> $ sudo pkg upgrade
>>> ...
>>>
>>> $ pkg info erlang
>>> erlang-17.3_3,3
>>> ...
>>>
>>>
>>> *** Errors persist
>>>
>>> Upgrading erlang has not changed behaviour.
>>>
>>> A couple more observations:
>>>
>>> 1. Running dialyzer on the module dt below gets the error as noted
>>> previously.  However, if I uncomment the '%% ok' line, dialyzer will
>>> process the module with no problems.
>>>
>>>     -module(dt).
>>>     -export([get_map/0]).
>>>
>>>     -spec get_map() -> map().
>>>     get_map() ->
>>>         #{labels => [one, two],
>>>           number => 27,
>>> %%          [1,2,3] => wer,        %% ok
>>>           kvok => #{
>>>                 a => qwe,
>>>                 2 => asd,
>>>                 [1,2,3] => wer,  %% bad
>>>                 {4,5,6} => sdf,  %% bad
>>>                 "abc" => zxc
>>>            }
>>>          }.
>>>
>>>     $ dialyzer dt.erl
>>>       Checking whether the PLT /home/ivan/.dialyzer_plt is up-to-date...
>>> yes
>>>       Proceeding with analysis...
>>>     =ERROR REPORT==== 27-Nov-2014::12:17:02 ===
>>>     Error in process <0.45.0> with exit value:
>>> {{case_clause,map},[{dialyzer_dataflow,find_terminals,1,[{
>>> file,"dialyzer_dataflow.erl"},{line,3451}]},{dialyzer_
>>> dataflow,find_terminals_list,3,[{file,"dialyzer_dataflow.
>>> erl"},{line,3504}]},{dialyzer_dataflow,classify_returns...
>>>
>>>
>>>     dialyzer: Analysis failed with error:
>>>     {{case_clause,map},
>>>      [{dialyzer_dataflow,find_terminals,1,
>>> [{file,"dialyzer_dataflow.erl"},{line,3451}]},
>>>       {dialyzer_dataflow,find_terminals_list,3,
>>> [{file,"dialyzer_dataflow.erl"},{line,3504}]},
>>>       {dialyzer_dataflow,classify_returns,1,
>>> [{file,"dialyzer_dataflow.erl"},{line,3443}]},
>>>       {dialyzer_dataflow,'-state__get_warnings/2-fun-0-',7,
>>> [{file,"dialyzer_dataflow.erl"},{line,2908}]},
>>>       {lists,foldl,3,[{file,"lists.erl"},{line,1261}]},
>>>       {dialyzer_dataflow,state__get_warnings,2,
>>> [{file,"dialyzer_dataflow.erl"},{line,2934}]},
>>>       {dialyzer_dataflow,get_warnings,5,
>>> [{file,"dialyzer_dataflow.erl"},{line,142}]},
>>>       {dialyzer_succ_typings,collect_warnings,2,
>>> [{file,"dialyzer_succ_typings.erl"},{line,182}]}]}
>>>     Last messages in the log cache:
>>>       Reading files and computing callgraph... done in 0.07 secs
>>>       Removing edges... done in 0.00 secs
>>>
>>>
>>> 2. Running dialyzer on the module dt2 below raises the warning
>>> following.  Uncommenting the '%% ok' line has no effect.
>>>
>>>     -module(dt2).
>>>     -export([get_map/0]).
>>>
>>>     -spec get_map() -> map().
>>>     get_map() ->
>>>         X = #{labels => [one, two],
>>>           number => 27,
>>> %%          [1,2,3] => wer,        %% ok
>>>           kvok => #{
>>>                 a => qwe,
>>>                 2 => asd,
>>>                 [1,2,3] => wer,  %% bad
>>>                 {4,5,6} => sdf,  %% bad
>>>                 "abc" => zxc
>>>            }
>>>          },
>>>         X.
>>>
>>>     $ dialyzer dt2.erl
>>>       Checking whether the PLT /home/ivan/.dialyzer_plt is up-to-date...
>>> yes
>>>       Proceeding with analysis...
>>>     dt2.erl:5: Function get_map/0 has no local return
>>>      done in 0m0.41s
>>>     done (warnings were emitted)
>>>
>>> Best wishes
>>>
>>> Ivan
>>>
>>>
>>>
>>>
>>> On 11/25/14 20:37, Dave Cottlehuber wrote:
>>>
>>>> Sorry about that last email …
>>>>
>>>> EWORKSFORME.
>>>>
>>>> FreeBSD 10.1 amd64, erlang-17.3_2,3 from pkg.
>>>>
>>>> What FreeBSD & erlang are you using?
>>>>
>>>> dch   /tmp ❯❯❯   dialyzer --build_plt --apps erts kernel stdlib
>>>>    Creating PLT /home/dch/.dialyzer_plt ...
>>>> Unknown functions:
>>>>    compile:file/2
>>>>    compile:forms/2
>>>>    compile:noenv_forms/2
>>>>    compile:output_generated/1
>>>>    crypto:block_decrypt/4
>>>>    crypto:start/0
>>>> Unknown types:
>>>>    compile:option/0
>>>>   done in 1m8.53s
>>>> done (passed successfully)
>>>>
>>>> dch   /tmp ❯❯❯dialyzer ltu.erl
>>>>    Checking whether the PLT /home/dch/.dialyzer_plt is up-to-date... yes
>>>>    Proceeding with analysis... done in 0m0.41s
>>>> done (passed successfully)
>>>>
>>>> dch   /tmp ❯❯❯erl
>>>> Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:8:8] [async-threads:64]
>>>> [kernel-poll:true]
>>>>
>>>> Eshell V6.2  (abort with ^G)
>>>> 1>
>>>>
>>>> A+, Dave
>>>> — sent from my Couch
>>>>
>>>>
>>>> _______________________________________________
>>>> erlang-questions mailing list
>>>> 
>>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>>
>>>
>>> --
>>> ============================================================
>>> Ivan A. Uemlianin PhD
>>> Llaisdy
>>> Speech Technology Research and Development
>>>
>>>                     
>>>                         @llaisdy
>>>                          llaisdy.wordpress.com
>>>               github.com/llaisdy
>>>                      www.linkedin.com/in/ivanuemlianin
>>>
>>>                         festina lente
>>> ============================================================
>>>
>>> _______________________________________________
>>> erlang-questions mailing list
>>> 
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>
>>
>>
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150313/b9f7c131/attachment.html>


More information about the erlang-questions mailing list