假设我有这段C / C ++代码:
int c = 12; // Should I count this line as basic block?
if (a != 0 && b > 10) {
c += (a + b);
} else {
c += 1;
}
printf("%d", c); // Should I count this line as basic block?
测试用例a = 1, b = 12
的基本块覆盖是什么?
是75%还是50%?
我应该将第1行和最后一行计为基本块吗? 基本块的精确定义是什么?
另一个混乱点:
int c = 16;
d += c;
是一个基本块还是2个基本块?是否应将每一行计为基本块?
答案 0 :(得分:6)
基本块包含所有具有以下属性的指令:如果其中一个被执行,那么同一基本块中的所有其他指令都是。将基本块的第一条指令命名为 leader ,我们得到以下基本块的定义:领导者之后的所有指令的集合,如果执行领导者则执行该指令。领导者是基本块的开始。
确定领导者在代码中找到所有跳转指令。每个跳跃目标和跳跃后的每个指令都是领导者。方法中的第一条指令也是领导者。
要查找基本块,只需完成从领导到下一个的所有说明。
你的第一个例子:
int c = 12; // Leader
if (a != 0 && b > 10) { // Jump
c += (a + b); // Leader
} else {
c += 1; // Leader
}
printf("%d", c); // Leader -- target of jump from the end of the true branch
您有有4个基本块:一个用于if
,一个用于每个分支的printf
之后的if
,一个用于初始化c
。如果a == 1 && b == 12
只执行了三个基本块,则覆盖率为75%。
你的第二个例子没有跳转指令=>只有一个基本块。