- assigned_to: nobody --> vlad_r
Michael Giroux highlighted a feature in how EMMA
partitions code into basic blocks that in some cases
assigns line coverage in very unintuitive ways.
The issue is that in code like this:
<pre>
void foo (InputStream in)
{
String s = "s";
try
{
in.read ();
}
catch (Exception ignore) {}
...
}
</pre>
both "String s =..." and "in.read ()" lines will always be
either covered or uncovered together.
The reason is that the bytecode instrumentor does not
consider beginnings of try blocks as basic block leaders.
At the time it seemed logical (there is no branch or
branch target at that point, after all, and some
processing time is saved not chasing after the exception
table data). However, it results in counter-intuitive
overage reporting when the entire block never completes
execution in a given test run. (Seemed like a genuine
bug at first but then I remembered it was a "by design"
feature in the instrumentor.)
In the example above, both "String s =..." and "in.read
()" lines are actually made members of the same basic
block. If reading from "in" always fails, the assignment is
also considered to not be covered. It looks odd,
considering it appears to be the first line in a method and
should always execute.