これは、テストを通じてバグとして明らかにする方法がわからない微妙なエラーを説明するための C の非常に単純な例です。
検討:
#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;
}
コードに示されているように、abreak
が欠落しているため、1 を入力すると、ケース 2 に移行します。1 の出力は、b
後で上書きされるため、これを反映していません。したがって、たとえばセットから数値を入力することによって設計できるすべてのテストは、{1, 2, 10}
すべて正しい出力になります。
実際には、 内の割り当てはswitch
非常にコストがかかる可能性があるため、このバグは非常に高くつく可能性があります。しかし、初日からこのように書かれたと仮定すると、コストが予想よりも高いことを確認するベンチマークはありません。
では、この種のエラーを洗い流すにはどうすればよいでしょうか? 実稼働ソフトウェアで公開するテスト ケースを設計する方法はありますか?
編集
だから私は完全に明確ではなかったと思います-発生した問題の種類を説明するためにCで書きましたが、実際にはCに固有のものではありません.私が作ろうとしているポイントは、コードがセクションに入るということです入るつもりはありませんでした(この場合はbreak
、要点を説明するのを忘れたためです)。私の実際のケースは、700,000 行の Fortran コードであり、言語の観点からは正当であるが非常に高価になる可能性がある不十分な if/switch 設計のために、意図したことのない分岐に入ります。
テストを設計したり、あるべきではないブランチに入ることを教えてくれるツールからのデータを調べたりすることは可能ですか? 「私はここにいるべきではない!」と印刷して間違いを見つけました。すべてのケースの中でそれが印刷されているのを見たので、無作為にそれを見て印刷ステートメントを入れるよりも良い方法があるはずです.