Block coverage
Code Coverage for C++
When analyzing C++ source code, Code Coverage can provide the following block coverage types:
-
Statement Blocks
-
Statement Blocks and Decisions
-
Statement Blocks, Decisions, and Loops
Statement Blocks
Statement blocks are the C++ function or method main blocks, blocks introduced by decision instructions:
-
THEN and ELSE FOR IF, WHILE and DO ... WHILE blocks
-
non-empty blocks introduced by SWITCH CASE or DEFAULT statements
-
true and false outcomes of ternary expressions (<expr> ? <expr> : <expr>)
-
TRY blocks and any associated catch handler
-
blocks following a potentially terminal statement.
int main ( ) /* -BLOCK */
{
try {
if ( 0 )
{
func ( "Hello" );
}
else
{
throw UnLucky ( );
}
}
catch ( Overflow & o ) {
cout << o.String << '\n';
}
catch ( UnLucky & u ) {
throw u;
} /* potentially terminal statement */
return 0; /* sequence block */
}
Each simple block is a branch. Every C++ function and method contains at least one simple block corresponding to its main body.
Decisions (Implicit Blocks)
Implicit blocks are introduced by IF statements without an ELSE statement, and a SWITCH statements without a DEFAULT statement.
/* Power_of_10 function */
/* -BLOCK=DECISION or -BLOCK=IMPLICIT */
int power_of_10 ( int value, int max )
{
int retval = value, i;
if ( value == 0 ) return 0; else ;
for ( i = 0; i < 10; i++ )
{
retval = ( max / 10 ) < retval ? retval * 10 : max;
}
return retval;
}
/* Near_color function */
ColorType near_color ( ColorType color )
{
switch ( color )
{
case WHITE :
case LIGHT_GRAY :
return WHITE;
case RED :
case PINK :
case BURGUNDY :
return RED;
/* etc ... with no default */
default : ;
}
}
Each implicit block represents a branch.
Since the sum of all possible decision paths includes implicit blocks as well as simple blocks, reports provide the total number of simple and implicit blocks as a figure and a percentage after the term decisions.
Loops (Logical Blocks)
Three branches are created in a for or while loop:
-
The first branch is the simple block contained within the loop, and that is executed zero times (the entry condition is false from the start).
-
The second branch is the simple block executed exactly once (entry condition true, then false the next time).
-
The third branch is the simple block executed at least twice (entry condition true at least twice, and false at the end).
Two branches are created in a DO/WHILE loop, as the output condition is tested after the block has been executed:
-
The first branch is the simple block executed exactly once (output condition true the first time).
-
The second branch is the simple block executed at least twice (output condition false at least once, then true at the end).
/* myClass::tryFiveTimes method */ /* -BLOCK=LOGICAL */
int myClass::tryFiveTimes ()
{
int result, i = 0;
/* letsgo ( ) is a function whose return value depends
on the availability of a system resource, for example */
while ( ( ( result = letsgo ( ) ) != 0 ) &&
( ++i < 5 ) );
return result;
} /* 3 logical blocks */
You need to execute the method tryFiveTimes ( ) several times to completely cover the three logical blocks included in the while loop.
Related Topics
Selecting coverage types | Code Coverage settings