[erlang-bugs] Dialyzer bug: incorrect duplicate modules

Evgeniy Khramtsov xramtsov@REDACTED
Thu Mar 21 10:40:26 CET 2013


On 21.03.2013 16:40, Maxim Treskin wrote:
> Hello
>
> At Montenegro Erlang Hackaton ( 
> http://lanyrd.com/2013/herceg-novi-erlang-meetup/ , there were only 
> two people, unfortunately ) we found incorrect behaviour of Dialyzer.
>
> Our project erroneous had a duplicated modules with the same name, but 
> different content. When we check it with dialyzer it show me something 
> like that:
>
> Duplicate modules: [["/var/tmp/myproj/apps/myproj/ebin/psc_operate.beam",
>                     
>  "/var/tmp/myproj/deps/somedep/ebin/amp_common_utils.beam"]]
>
> Obviously it is not the same modules. So I had to search this bug and 
> find strange behaviour in dialyzer. Function lists:zip/2 called with 
> two list, where first is reversed list of modules as atom, and second 
> is list of filepaths for modules. And this list not always contains 
> correspond elements. Module with name some_module1 can be has filename 
> like abc_module55.beam. This is the cause of error.
>
> This bug exists in R15B02 and R16.
>
> I wrote such patch to fix bug, but I don't know whether this is 
> solution or not, though it works fine.
>
> --- /opt/r16a/lib/dialyzer-2.5.4/src/dialyzer_analysis_callgraph.erl   
>  2013-01-31 12:55:53.210402846 +0700
> +++ dialyzer_pa/dialyzer_analysis_callgraph.erl 2013-03-21 
> 13:20:46.794991889 +0700
> @@ -255,10 +255,18 @@
>    CServer2 = dialyzer_codeserver:set_next_core_label(NextLabel, CServer),
>    case Failed =:= [] of
>      true ->
> -      NewFiles = lists:zip(lists:reverse(Modules), Files),
> +      %% Modules and Files have not the same order, so it is 
> meaningless to zip it
> +      %% NewFiles = lists:zip(lists:reverse(Modules), Files),
> +
>        ModDict =
> -        lists:foldl(fun({Mod, F}, Dict) -> dict:append(Mod, F, Dict) end,
> -                    dict:new(), NewFiles),
> +        lists:foldl(fun(F, Dict) ->
> +                        ModFile = lists:last(filename:split(F)),
> +                        Mod = filename:basename(ModFile, ".beam"),
> +                        dict:append(Mod, F, Dict) end,
> +                    dict:new(), Files),
> +      %% ModDict =
> +      %%   lists:foldl(fun({Mod, F}, Dict) -> dict:append(Mod, F, 
> Dict) end,
> +      %%               dict:new(), NewFiles),
>        check_for_duplicate_modules(ModDict);
>      false ->
>        Msg = io_lib:format("Could not scan the following file(s): ~p",

I have the same problem. Thanks for the patch.

-- 
Regards,
Evgeniy Khramtsov, ProcessOne.
xmpp:xram@REDACTED




More information about the erlang-bugs mailing list