<div dir="ltr">Hi,<div>This appears to be a bug in OTP's cover.erl, i isolated your code to the following simple module:</div><div><br></div><div><div>-module(t).</div><div>-compile([export_all]).</div><div><br></div><div>pad(A, L) -></div><div>    P = << <<"#">> || _ <- lists:seq(1, L) >>,</div><div>    <<A/binary, P/binary>>.</div><div><br></div><div>test() -></div><div>    pad(<<"hi">>, 2).</div></div><div><br></div><div>i then issue the following commands in an erl shell:</div><div><br></div><div>1> c(t, [debug_info]).<br></div><div>{ok,t}<br></div><div>2> t:test().<br></div><div><<"hi##">>                      %% no problem here</div><div>3> cover:start().<br></div><div>{ok,<0.39.0>}<br></div><div><div>4> cover:compile_beam("t.beam").</div><div>{ok,t}</div></div><div><div>5> t:test().</div><div>** exception error: bad argument</div><div>     in function  t:'-pad/2-lbc$^0/2-0-'/2 (t.erl, line 5)</div><div>     in call from t:pad/2 (t.erl, line 5)</div><div><br></div></div><div>Cover manipulates the original .beam abstract code, inserts it's hooks for code</div><div>coverage statistics and then compiles the manipulated abstract code and loads it,</div><div>rebar then runs the eunit test. A closer look at the abstract code before and after the</div><div>manipulation shows the following:</div><div><br></div><div>before:</div><div>    [{match,5,</div><div>                       {var,5,'P'},</div><div>                       {bc,5,</div><div>                           {bin,5,</div><div>                               [{bin_element,5,</div><div>                                   <b> {string,5,"#"},</b></div><div>                                    default,default}]}</div><div><br></div><div>after:</div><div><div>    {match,5,</div><div>                      {var,5,'P'},</div><div>                      {bc,5,</div><div>                          {bin,5,</div><div>                              [{bin_element,5,</div><div>                                   <b>{block,0,[{string,5,"#"}]},</b></div><div>                                   default,default}]},</div></div><div><br></div><div>if i hack cover.erl and remove the <b>{block</b> instruction the test succeeds, </div><div>could this really be a Cover or am i missing something?</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 16, 2015 at 9:49 PM, ruanbeihong <span dir="ltr"><<a href="mailto:ruanbeihong@gmail.com" target="_blank">ruanbeihong@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi everyone,<br>
<br>
I'm learning erlang  for a while. Currently I'm using rebar<br>
to manage building and test work. I find the cover test<br>
provided in rebar (eunit?) quite convenient.<br>
<br>
But recently I come across a strange situation: when running<br>
test without '{cover_enabled, true}.' in rebar.conf, it<br>
works find and passed my test, but with it will result in a<br>
fail of test. And the crush info is IMO not quite useful.<br>
<br>
So I ask here for someone might come across same problem and<br>
to see if this is a bug.<br>
<br>
My code is at  <a href="https://github.com/jamesruan/z85" rel="noreferrer" target="_blank">https://github.com/jamesruan/z85</a><br>
commit: 6e0fc13667<br>
simply git clone it and run:<br>
  rebar eunit<br>
or<br>
  rebar -C rebar.conf eunit<br>
The first will success in my environment (<br>
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-<br>
threads:10] [kernel-poll:false])<br>
But the second will fail.<br>
<br>
Thanks,<br>
<br>
James Ruan<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">PGP fingerprint: F708 E141 AE8D 2D38 E1BC  DF3D 1719 3EA0 647D 7260</div></div>
</div></div>