compile:forms/1 crashes

Bjorn Gustavsson <>
Tue Oct 4 17:03:10 CEST 2005


There is a bug in erl_lint in R10B and earlier. It will do some validation
only when it encounters an {eof,Line} term. If {eof,Line} is missing, it will,
for instance, not validate local function calls.

The workaround is to always include an {eof,Line} term as the last form
in the list.

The bug in erl_lint has already been fixed in our internal R11B development branch.
We might fix it in R10B-8 too.

/Björn

"Ulf Wiger (AL/EAB)" <> writes:

> Using compiler-4.3.9 (the latest one).
> 
> I'm trying to generate some code, and am experiencing the 
> lack of user-friendliness in compile:forms/1. 
> Just about all errors in the generated forms manifest themselves
> as crashes in erl_lint or other. Below is a crash from beam_dead.
> 
> I'm not sure whether this is a bug in my generated code, or in
> the compiler.
> 
> /Uffe
> 
> 
> ()92> rdbms_validate:codegen([person], 1).
> [{attribute,1,module,rdbms_jit},
>  ...
> ()93> io:format("~p~n", [v(92)]).
> [{attribute,1,module,rdbms_jit},
>  {attribute,2,export,[{validate,2}]},
>  {function,3,
>            validate,
>            2,
>            [{clause,3,
>                     [{atom,3,person},{var,3,'Object'}],
>                     [],
>                     [{call,3,{atom,3,validate_person},[{var,3,'Object'}]}]}]},
>  {function,4,
>            validate_person,
>            2,
>            [{clause,4,
>                     [{atom,4,person},
>                      {tuple,4,
>                             [{var,4,person},
>                              {var,4,'V_id'},
>                              {var,4,'V_name'},
>                              {var,4,'V_addr'},
>                              {var,4,'V_age'}]}],
>                     [],
>                     [{'if',6,
>                            [{clause,6,
>                                     [],
>                                     [[{op,6,
>                                           '=/=',
>                                           {var,6,'V_id'},
>                                           {atom,6,'#.[].#'}}]],
>                                     [{atom,6,true}]},
>                             {clause,7,
>                                     [],
>                                     [[{atom,7,true}]],
>                                     [{call,
>                                          8,
>                                          {atom,8,throw},
>                                          [{tuple,
>                                               8,
>                                               [{atom,8,type_error},
>                                                {atom,8,id},
>                                                {tuple,
>                                                    9,
>                                                    [{atom,9,expected},
>                                                     {atom,9,not_null}]}]}]}]}]}, 
>                      {'if',8,
>                            [{clause,8,
>                                     [],
>                                     [[{call,
>                                           8,
>                                           {atom,8,is_integer},
>                                           [{var,8,'V_age'}]}]],
>                                     [{atom,8,true}]},
>                             {clause,9,
>                                     [],
>                                     [[{atom,9,true}]],
>                                     [{call,
>                                          10,
>                                          {atom,10,throw},
>                                          [{tuple,
>                                               10,
>                                               [{atom,10,type_error},
>                                                {atom,10,age},
>                                                {tuple,
>                                                    11,
>                                                    [{atom,11,expected},
>                                                     {atom,11,integer}]}]}]}]}]}, 
>                      {call,10,{atom,10,validate_oid},[{var,10,'V_id'}]},
>                      {call,11,{atom,11,validate_string},[{var,11,'V_name'}]},
>                      {'if',12,
>                            [{clause,12,
>                                     [],
>                                     [[{op,12,
>                                           '=<',
>                                           {integer,12,0},
>                                           {var,12,'V_age'}},
>                                       {op,12,
>                                           '=<',
>                                           {var,12,'V_age'},
>                                           {integer,12,100}}]],
>                                     [{atom,12,true}]},
>                             {clause,13,
>                                     [],
>                                     [[{atom,13,true}]],
>                                     [{call,
>                                          14,
>                                          {atom,14,throw},
>                                          [{tuple,
>                                               14,
>                                               [{atom,14,value_error},
>                                                {atom,14,age},
>                                                {tuple,
>                                                    15,
>                                                    [{atom,15,expected},
>                                                     {tuple,
>                                                         15,
>                                                         [{atom,15,inclusive},
>                                                          {integer,15,0},
>                                                          {integer,15,100}]}]}]}]}]}]}]}]}]
> ok
> ()94> compile:forms(v(92)).               
> .:none: internal error in beam_dead;
> crash reason: {{case_clause,{'EXIT',{function_clause,
>                                         [{dict,fetch_val,[5,[]]},
>                                          {beam_clean,find_all_used,3},
>                                          {beam_clean,module,2},
>                                          {beam_dead,module,2},
>                                          {compile,
>                                              '-select_passes/2-anonymous-2-',
>                                              2},
>                                          {compile,
>                                              '-internal_comp/4-anonymous-1-',
>                                              2},
>                                          {compile,fold_comp,3},
>                                          {compile,internal_comp,4}]}}},
>                [{compile,'-select_passes/2-anonymous-2-',2},
>                 {compile,'-internal_comp/4-anonymous-1-',2},
>                 {compile,fold_comp,3},
>                 {compile,internal_comp,4},
>                 {compile,internal,3}]}
> .:4: Warning: variable 'V_addr' is unused
> .:4: Warning: variable person is unused
> error
> 
> 

-- 
Björn Gustavsson, Erlang/OTP, Ericsson AB



More information about the erlang-questions mailing list