基本块覆盖 - 精确定义是什么?

Mac*_*rko 6 testing unit-testing code-coverage

假设我有这段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?
Run Code Online (Sandbox Code Playgroud)

测试用例的基本块覆盖a = 1, b = 12什么?

是75%还是50%?

我应该将第1行和最后一行计为基本块吗?基本块的精确定义是什么?

另一个困惑点:

int c = 16;
d += c;
Run Code Online (Sandbox Code Playgroud)

它是一个基本块还是2个基本块?每条线都应算作基本块吗?

Mih*_*eac 6

基本块包含所有指令,这些指令具有以下属性:如果其中一个被执行,那么同一基本块中的所有其他指令都是.将基本块的第一条指令命名为领导者,我们得到以下基本块的定义:领导者之后的所有指令的集合,如果执行领导者则执行该指令.领导者是基本块的开始.

确定领导者在代码中找到所有跳转指令.每个跳跃目标和跳跃后的每个指令都是领导者.方法中的第一条指令也是领导者.

要找到基本块,只需完成从领导到下一个的所有指令.

你的第一个例子:

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
Run Code Online (Sandbox Code Playgroud)

你有4个基本块:一个用于每个分支if,一个用于printf后面if,一个用于初始化c.如果a == 1 && b == 12仅执行三个基本块,则覆盖率为75%.

你的第二个例子没有跳转指令=>只有一个基本块.