【问题标题】:Basic block coverage - what's the precise definition?基本区块覆盖——准确的定义是什么?
【发布时间】:2012-02-10 07:24:20
【问题描述】:

假设我有这段 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%?

我应该将第一行和最后一行算作基本块吗? 基本块的准确定义是什么?

另一个混淆点:

int c = 16;
d += c;

是1个基本块还是2个基本块?每一行都应该算作一个基本块吗?

【问题讨论】:

    标签: unit-testing testing code-coverage


    【解决方案1】:

    一个基本块包含所有具有以下属性的指令:如果其中一个被执行,那么同一基本块中的所有其他指令都会被执行。将基本块的第一条指令命名为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 的每个分支,一个用于if 之后的printf,一个用于c 的初始化。如果a == 1 && b == 12 只执行三个基本块,则覆盖率为 75%。

    您的第二个示例没有跳转指令 => 只有一个基本块。

    【讨论】:

    • 基本块的很好解释。
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2020-10-17
    • 2011-04-24
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多