[erlang-bugs] Compiler bug with unsafe variables in nested try statements.

Anthony Ramine <>
Tue Jul 23 09:28:41 CEST 2013


Hello Paul,

I've added a fix for that bug in another patch I submitted which fixes a bunch of problems with variable usage tracking.

Regards,

-- 
Anthony Ramine

Le 21 juil. 2013 à 00:33, Paul Davis a écrit :

> I seem to have uncovered a bug when detecting or displaying "variable
> 'Acc' unsafe in 'try'" errors. I managed to reduce this to a fairly
> small test case:
> 
> -module(bam).
> -export([bang/0]).
> bang() ->
>    case 1 of
>        nil ->
>            Acc = 2;
>        _ ->
>            try
>                Acc = 3,
>                Acc
>            catch _:_ ->
>                ok
>            end
>    end,
>    Acc.
> 
> The important point that I found is that its necessary to reference
> Acc in the try body after its been bound. Without that the unsafe
> error is generated properly.
> 
> The error I'm seeing is:
> 
> Function: bang/0
> bam.erl:none: internal error in core_dsetel_module;
> crash reason: {{badmatch,error},
>               [{sys_core_dsetel,visit,2,
>                                 [{file,"sys_core_dsetel.erl"},{line,98}]},
>                {sys_core_dsetel,visit,2,
>                                 [{file,"sys_core_dsetel.erl"},{line,117}]},
>                {sys_core_dsetel,visit_module_1,3,
>                                 [{file,"sys_core_dsetel.erl"},{line,79}]},
>                {sys_core_dsetel,visit_module,1,
>                                 [{file,"sys_core_dsetel.erl"},{line,75}]},
>                {sys_core_dsetel,module,2,
>                                 [{file,"sys_core_dsetel.erl"},{line,70}]},
>                {compile,core_dsetel_module,1,
>                         [{file,"compile.erl"},{line,1159}]},
>                {compile,'-internal_comp/4-anonymous-1-',2,
>                         [{file,"compile.erl"},{line,276}]},
>                {compile,fold_comp,3,[{file,"compile.erl"},{line,294}]}]}
> 
> I discovered this on R14B01 but its still present on R16B01 as well.
> 
> Out of curiosity I also reproduced it with an if statement as well:
> 
> #!/usr/bin/env escript
> 
> -mode(compile).
> 
> main(_) ->
>    Maybe = bar(),
>    if Maybe ->
>        Acc = 1;
>    true ->
>      try
>          Acc = 2,
>          Acc %, throw(foo)
>      catch _ ->
>        ok
>      end
>  end,
>  erlang:display(Acc).
> 
> bar() -> false.
> 
> Somewhat fun is that if we comment out -mode(compile) for interpreted
> mode we can get all three values (1, 2, unbound) of Acc by changing
> bar/0 and/or uncommenting the throw statement.
> 
> Obviously my code is broken trying to reference a variable like that;
> I was just a bit surprised to see a compiler error.
> _______________________________________________
> erlang-bugs mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-bugs



More information about the erlang-bugs mailing list