这是一个超级简单的例子,在这里用 C 语言来说明一个我不知道如何通过测试将其暴露为 bug 的细微错误。
考虑:
#include <stdio.h>
int main()
{
int a;
int b;
int input;
printf("Enter 1 or 2: ");
scanf("%d", &input);
switch(input) {
case 1:
a = 10;
/* ERROR HERE, I FORGOT A BREAK! */
case 2:
b = 20;
break;
default:
printf("You didn't listen!\n");
return 1;
break;
}
if(input == 1) {
b = 30;
printf("%d, %d\n", a, b);
} else {
printf("%d\n",b);
}
return 0;
}
如代码中所述,break
缺少 a ,因此当输入 1 时,它会落入案例 2。但 1 的输出并没有反映这一点,因为它b
稍后会覆盖。因此,我们可以设计的所有测试,比如从集合中输入一个数字,{1, 2, 10}
都会产生正确的输出。
实际上,内部的分配switch
可能非常昂贵,因此这个错误可能非常昂贵。但是,假设从第一天开始就是这样写的,没有基准可以看出成本高于预期。
那么可以做些什么来清除这些类型的错误呢?有没有办法设计测试用例以在生产软件中公开它?
编辑
所以我想我并不完全清楚——我用 C 编写它来说明遇到的问题的类型,但实际上它并不特定于 C。我想要说明的一点是代码进入了我们的部分从来没有打算进入(在这种情况下,因为忘记break
说明这一点)。我的实际案例是一个有 700,000 行的 Fortran 代码,它进入了我们从未打算进入的分支,因为 if/switch 设计不佳,从语言的角度来看这是合法的,但可能非常昂贵。
是否有可能设计一个测试或查看来自某些工具的一些数据,这些数据会告诉我们它正在进入不应该进入的分支?我在打印“我不应该在这里!”时发现了一个错误。在所有的情况下,看到它被打印出来,肯定有比随机看到它并放置打印语句更好的方法。