[erlang-bugs] Compiler bug on R15B03

Loïc Hoguin <>
Mon Dec 17 11:23:21 CET 2012


Hello,

We have found a couple issues when compiling and executing a certain 
module. Reproduced on 2 machines. Mine was running ArchLinux 64bits.

This file:

https://raw.github.com/extend/bank_mysql/master/src/bank_mysql.erl

You can compile it with -compile(export_all) to quickly test the issue. 
Load the beam in the R15B03 VM and then run:

 > bank_mysql:params_to_bin([123,21340949]).

You'll get a weird failure in a clause where one of these integers 
appears to be a binary (line 549). That's not true though, because if 
you io:format/2 there nothing will appear. The code properly goes 
through the clause for integers.

It's not related to the values, it also does it if it's something other 
than integers (like a datetime tuple and a binary). The 
closest-to-failure call reproducing this issue, found by tracing, is:

 > bank_mysql:params_to_bin([21340949], <<0:1>>, 
<<8,0>>,<<123,0,0,0,0,0,0,0,0>>).

I have no idea what happens there. The line given is definitely not the 
right one, and the code worked fine on R15B01, no reasons it shouldn't 
on R15B03.

Other weirdness, I wanted to try editing the .S file, adding {line, 
[...]} clauses in order to find exactly where it failed, but it seems I 
can't even compile the .S file generated at all. I get this error:

% erlc -S src/bank_mysql.erl
% erlc bank_mysql.S
Function: connect/5
bank_mysql.S:none: internal error in beam_block;
crash reason: {{case_clause,
                 {'EXIT',
                  {function_clause,
                   [{beam_utils,live_opt,
                     [[{init,{y,0}},{allocate,4,5},{label,2}],
                      31,
                      {10,
                       {8,1,
                        {6,1,
                         {1,31,nil,{5,1,{4,0,{3,0,nil,nil},nil},nil}},
                         {7,1,nil,nil}},
                        {10,1,{9,1,nil,nil},{11,1,nil,nil}}}},
                      [{block,
                        [{'%live',5},
                         {set,[{y,3}],[{x,2}],move},
                         {set,
                          [{x,2}],
                          [{literal,[binary,{active,false},{packet,raw}]}],
                          move},
                         {set,[{y,1}],[{x,4}],move},
                         {set,[{y,2}],[{x,3}],move},
                         {'%live',3}]},
                       {line,[{location,"src/bank_mysql.erl",158}]},
                       {call_ext,3,{extfunc,gen_tcp,connect,3}},
                       {test,is_tuple,{f,5},[{x,0}]},
                       {test,test_arity,{f,5},[{x,0},2]},
                       {block,
                        [{'%live',1},
                         {set,[{x,1}],[{x,0}],{get_tuple_element,0}},
                         {set,[{x,2}],[{x,0}],{get_tuple_element,1}},
                         {'%live',3}]},
                       {test,is_eq_exact,{f,5},[{x,1},{atom,ok}]},
                       {block,
                        [{'%live',3},
                         {set,[],[],{alloc,3,{nozero,nostack,9,[]}}},
                         {set,[{x,0}],[],{put_tuple,8}},
                         {set,[],[{atom,mysql_client}],put},
                         {set,[],[{x,2}],put},
                         {set,[],[{literal,<<>>}],put},
                         {set,[],[{integer,0}],put},
                         {set,[],[{atom,ready}],put},
                         {set,[],[nil],put},
                         {set,[],[{integer,5000}],put},
                         {set,[],[{integer,100000}],put},
                         {'%live',1}]},
                       {line,[{location,"src/bank_mysql.erl",161}]},
                       {call,1,{f,264}},
                       {test,is_tuple,{f,6},[{x,0}]},
                       {test,test_arity,{f,6},[{x,0},3]},
                       {block,
                        [{'%live',1},
                         {set,[{x,1}],[{x,0}],{get_tuple_element,0}},
                         {set,[{x,2}],[{x,0}],{get_tuple_element,1}},
                         {set,[{x,3}],[{x,0}],{get_tuple_element,2}},
                         {'%live',4}]},
                       {test,is_eq_exact,{f,6},[{x,1},{atom,ok}]},
                       {block,
                        [{'%live',4},
                         {set,[{x,0}],[{x,2}],move},
                         {set,[{y,0}],[{x,3}],move},
                         {'%live',1}]},
                       {line,[{location,"src/bank_mysql.erl",163}]},
                       {call,1,{f,68}},
                       {test,is_tuple,{f,7},[{x,0}]},
                       {test,test_arity,{f,7},[{x,0},9]},
                       {block,
                        [{'%live',1},
                         {set,[{x,1}],[{x,0}],{get_tuple_element,0}},
                         {set,[{x,2}],[{x,0}],{get_tuple_element,4}},
                         {set,[{x,3}],[{x,0}],{get_tuple_element,6}},
                         {'%live',4}]},
                       {test,is_eq_exact,{f,7},[{x,1},{atom,ok}]},
                       {block,
                        [{'%live',4},
                         {set,[{x,4}],[{x,3}],move},
                         {set,[{x,3}],[{x,2}],move},
                         {set,[{x,2}],[{y,1}],move},
                         {set,[{x,1}],[{y,2}],move},
                         {set,[{x,5}],[{y,0}],move},
                         {set,[{x,0}],[{y,3}],move},
                         {'%live',6}]},
                       {kill,{y,0}},
                       {kill,{y,1}},
                       {kill,{y,2}},
                       {kill,{y,3}},
                       {line,[{location,"src/bank_mysql.erl",164}]},
                       {call,6,{f,183}},
                       {test,is_tuple,{f,8},[{x,0}]},
                       {test,test_arity,{f,8},[{x,0},2]},
                       {block,
                        [{'%live',1},
                         {set,[{x,1}],[{x,0}],{get_tuple_element,0}},
                         {set,[{x,2}],[{x,0}],{get_tuple_element,1}},
                         {'%live',3}]},
                       {test,is_eq_exact,{f,8},[{x,1},{atom,ok}]},
                       {block,
 
[{'%live',3},{set,[{x,0}],[{x,2}],move},{'%live',1}]},
                       {line,[{location,"src/bank_mysql.erl",166}]},
                       {call,1,{f,264}},
                       {test,is_tuple,{f,9},[{x,0}]},
                       {test,test_arity,{f,9},[{x,0},3]},
                       {block,
                        [{'%live',1},
                         {set,[{x,1}],[{x,0}],{get_tuple_element,0}},
                         {set,[{x,2}],[{x,0}],{get_tuple_element,1}},
                         {set,[{x,3}],[{x,0}],{get_tuple_element,2}},
                         {'%live',4}]},
                       {test,is_eq_exact,{f,9},[{x,1},{atom,ok}]},
                       {block,
                        [{'%live',4},
                         {set,[{x,0}],[{x,2}],move},
                         {set,[{y,2}],[{x,3}],move},
                         {set,[{y,3}],[{x,0}],move},
                         {'%live',1}]},
                       {line,[{location,"src/bank_mysql.erl",167}]},
                       {call,1,{f,62}},
                       {test,is_atom,{f,10},[{x,0}]},
                       {select_val,
                        {x,0},
                        {f,10},
                        {list,[{atom,error},{f,3},{atom,ok},{f,4}]}},
                       {label,3},
                       {block,
 
[{'%live',0},{set,[{x,0}],[{y,3}],move},{'%live',1}]},
                       {call_last,1,{f,168},4},
                       {label,4},
                       {block,
 
[{'%live',0},{set,[{x,0}],[{y,3}],move},{'%live',1}]},
                       {kill,{y,3}},
                       {line,[{location,"src/bank_mysql.erl",169}]},
                       {call,1,{f,74}},
                       {test,is_tuple,{f,11},[{x,0}]},
                       {test,test_arity,{f,11},[{x,0},6]},
                       {block,
                        [{'%live',1},
                         {set,[{x,1}],[{x,0}],{get_tuple_element,0}},
                         {set,[{x,2}],[{x,0}],{get_tuple_element,1}},
                         {set,[{x,3}],[{x,0}],{get_tuple_element,2}},
                         {set,[{x,4}],[{x,0}],{get_tuple_element,4}},
                         {set,[{x,5}],[{x,0}],{get_tuple_element,5}},
                         {'%live',6}]},
                       {test,is_eq_exact,{f,11},[{x,1},{atom,ok}]},
                       {test,is_eq_exact,{f,11},[{x,2},{integer,0}]},
                       {test,is_eq_exact,{f,11},[{x,3},{integer,0}]},
                       {test,is_eq_exact,{f,11},[{x,4},{integer,0}]},
                       {test,is_eq_exact,{f,11},[{x,5},{literal,<<>>}]},
                       {block,
                        [{'%live',0},
                         {set,[],[],{alloc,0,{nozero,nostack,3,[]}}},
                         {set,[{x,0}],[],{put_tuple,2}},
                         {set,[],[{atom,ok}],put},
                         {set,[],[{y,2}],put},
                         {'%live',1}]},
                       {deallocate,4},
                       return,
                       {label,5},
                       {line,[{location,"src/bank_mysql.erl",158}]},
                       {badmatch,{x,0}},
                       {label,6},
                       {line,[{location,"src/bank_mysql.erl",161}]},
                       {badmatch,{x,0}},
                       {label,7},
                       {line,[{location,"src/bank_mysql.erl",163}]},
                       {badmatch,{x,0}},
                       {label,8},
                       {line,[{location,"src/bank_mysql.erl",164}]},
                       {badmatch,{x,0}},
                       {label,9},
                       {line,[{location,"src/bank_mysql.erl",166}]},
                       {badmatch,{x,0}},
                       {label,10},
                       {line,[{location,"src/bank_mysql.erl",167}]},
                       {case_end,{x,0}},
                       {label,11},
                       {line,[{location,"src/bank_mysql.erl",169}]},
                       {badmatch,{x,0}}]],
                     [{file,"beam_utils.erl"},{line,654}]},
                    {beam_utils,live_opt,1,
                     [{file,"beam_utils.erl"},{line,205}]},
 
{beam_block,function,2,[{file,"beam_block.erl"},{line,41}]},
                    {lists,mapfoldl,3,[{file,"lists.erl"},{line,1278}]},
 
{beam_block,module,2,[{file,"beam_block.erl"},{line,29}]},
                    {compile,'-select_passes/2-anonymous-2-',2,
                     [{file,"compile.erl"},{line,473}]},
                    {compile,'-internal_comp/4-anonymous-1-',2,
                     [{file,"compile.erl"},{line,273}]},
 
{compile,fold_comp,3,[{file,"compile.erl"},{line,291}]}]}}},
                [{compile,'-select_passes/2-anonymous-2-',2,
                  [{file,"compile.erl"},{line,473}]},
                 {compile,'-internal_comp/4-anonymous-1-',2,
                  [{file,"compile.erl"},{line,273}]},
                 {compile,fold_comp,3,[{file,"compile.erl"},{line,291}]},
 
{compile,internal_comp,4,[{file,"compile.erl"},{line,275}]},
                 {compile,'-do_compile/2-anonymous-0-',2,
                  [{file,"compile.erl"},{line,152}]}]}

I'm even more lost with that.

Can you please tell me if you can reproduce this? Hope I can help get 
this resolved.

Thanks.

-- 
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu


More information about the erlang-bugs mailing list