[erlang-bugs] Compiler bug with unsafe variables in nested try statements.
Paul Davis
paul.joseph.davis@REDACTED
Tue Jul 23 09:36:53 CEST 2013
Thanks!
On Tue, Jul 23, 2013 at 2:28 AM, Anthony Ramine <n.oxyde@REDACTED> wrote:
> 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
>> erlang-bugs@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-bugs
>
More information about the erlang-bugs
mailing list