Branch coverage and unreachable branches
Task 1
For each example from the section "Statement coverage and unreachable code" (Task 1) of this book, create a Control Flow Graph and identify branches that are unreachable.
- Return Statement Before Print Statement
#include <stdio.h>
int main()
{
printf("text_1");
return 0;
printf("text_2");
}
Unreachable:
-
printf("text_2");
(It comes after thereturn
, so it will never execute.)
2. Infinite Loop Before Statements
if (x == 5)
{
break;
printf("Hello World");
}
Unreachable:
-
printf("Hello World");
(It is placed afterbreak
, so it will never be executed.)
3. Continue Before Print
for (...) {
continue;
printf("Hello World");
}
Unreachable:
-
printf("Hello World");
(zawsze pomijane przezcontinue
)
4. False Condition in if
Statement
double X = 1.55;
if (X > 5) {
X++;
}
return 0;
Unreachable (dla tej konkretnej wartości X):
-
X++;
(ponieważX > 5
jest fałszywe, ciałoif
nie jest wykonywane dla tej wartości; jednak kod sam w sobie nie jest strukturalnie nieosiągalny – jest tylko pomijany w tym przypadku)
Task 2
For each example from the section "Statement coverage and unreachable code" (Task 2) of this book, create a Control Flow Graph and identify branches that are unreachable.
1. Return statement before if statement.
int func(int a)
{
int b = a*2;
return b;
// Unreachable code
if (b < 10)
{
b += 10;
}
return b;
}
Unreachable:
Code below return statement is unreachable.
vector<string> vec;
while (true)
{
vec.push_back("abc");
if (vec.size() > 25)
{
return 0;
}
}
// Unreachable code
vec.pop_back();
Unreachable:
The infinite loop in this sample fills the 'vec' container with the string "abc". As the container's size exceeds 25, the return operator will be called to immediately terminate the function and bring control back to the return point. Due to this, the last item of the 'vec' container will never be removed.
tStatus = TGetFirstLayerItem (pContext, DBX_LAYER_MULTI, pLayerItem);
...
if (DBX_LAYER_MULTI && tStatus == DBX_OK)
{
// Writing styles
}
Unreachable: In this sample, the list of project styles will never be written because the condition (DBX_LAYER_MULTI && tStatus == DBX_OK) is always false. It contains the DBX_LAYER_MULTI constant which equals zero.
typedef unsigned short wint_t;
void lexungetc(wint_t c) {
if (c < 0)
return;
....
}
Unreachable:
The condition 'c<0' here is always false because 'c' is unsigned.
No Comments