[erlang-bugs] beam_validator does not validate against circularity in constructed values
Erik Søe Sørensen
ess@REDACTED
Mon Jun 27 11:15:28 CEST 2011
The following function passes beam_validator verification, but calls a
gc_bif while a tuple is not completely constructed.
(I take it that that could wreak havoc in the interpreter and is thus
illegal and technically a validator bug; I'm not completely certain of
this though. Apologies if this is not a bug after all.)
{module, beamtoying5}. %% version = 0
{exports, [{gc_in_cons,1},{gc_in_cons2,1}]}.
{attributes, []}.
{labels, 4}.
{function, gc_in_cons, 1, 2}.
{label,1}.
{func_info,{atom,beamtoying5},{atom,gc_in_cons},1}.
{label,2}.
{test_heap,3,1}.
{put_tuple,2,{x,1}}.
{put,{atom,dummy}}.
{gc_bif,'bnot',{f,0},1,[{x,0}],{x,0}}.
{put,{x,0}}.
{move,{x,1},{x,0}}.
return.
Another thing: If the "put dummy" instruction is moved down beside the
"put x0" instruction, then we get a function which also passes
beam_validator validation, yet results in the following error message
when the module is loaded:
=ERROR REPORT==== 27-Jun-2011::11:14:10 ===
Loading of /home/erik/kode/q/beamtoying5.beam failed: badfile
{error,badfile}
=ERROR REPORT==== 27-Jun-2011::11:14:10 ===
beam/beam_load.c(1771): Error loading function
beamtoying5:gc_in_cons2/1: op put_tuple u x:
no specific operation found
because the instruction rewriter expects a "put" directly after a
"put_tuple".
Regards,
Erik Søe Sørensen
More information about the erlang-bugs
mailing list