私たちのほとんどは、ループに非終了条件があってはならないことを知っています。たとえば、この C# ループには非終了条件があります。つまり、i の偶数値です。これは明らかな論理エラーです。
void CountByTwosStartingAt(byte i) { // If i is even, it never exceeds 254
for(; i < 255; i += 2) {
Console.WriteLine(i);
}
}
非常にありそうもないが、技術的には終了しない状態を構成するエッジ ケースが時々あります (スタック オーバーフローとメモリ不足エラーは別として)。ストリーム内の連続するゼロの数をカウントする関数があるとします。
int CountZeros(Stream s) {
int total = 0;
while(s.ReadByte() == 0) total++;
return total;
}
さて、あなたがこれを与えたとしましょう:
class InfiniteEmptyStream:Stream
{
// ... Other members ...
public override int Read(byte[] buffer, int offset, int count) {
Array.Clear(buffer, offset, count); // Output zeros
return count; // Never returns -1 (end of stream)
}
}
または、より現実的には、外部ハードウェアからデータを返すストリームで、場合によっては多数のゼロを返す可能性があります (机の上にあるゲーム コントローラーなど)。いずれにせよ、無限ループがあります。この特定の非終了条件は際立っていますが、そうでない場合もあります。
私が書いているアプリのように、完全に現実世界の例です。ゼロのエンドレス ストリームは、無限の「空の」オブジェクトに逆シリアル化されます (アイテムが 20 億を超えたためにコレクション クラスまたは GC が例外をスローするまで)。しかし、これはまったく予想外の状況です (私のデータ ソースを考えると)。
非終了条件がまったくないことはどれほど重要ですか? これは「堅牢性」にどの程度影響しますか? それらが「理論的に」非終了である場合にのみ問題になりますか(例外が暗黙の終了条件を表している場合は問題ありませんか)? アプリが商用かどうかは重要ですか? 一般配布したら?問題のあるコードがパブリック インターフェイス/API を介してアクセスできない場合は問題になりますか?
編集: 私が持っている主な懸念の1つは、非終了条件を作成する可能性のある予期しない論理エラーです。原則として、非終了条件がないことを確認すると、これらの論理エラーをより適切に識別または処理できますが、それだけの価値があるでしょうか? そしていつ?これは、信頼と直交する懸念事項です。