Большинство из нас знает, что цикл не должен иметь условия без завершения. Например, этот цикл 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)
}
}
Или, более реалистично, возможно, поток, который возвращает данные с внешнего оборудования, который в некоторых случаях может возвращать множество нулей (например, игровой контроллер, сидящий на вашем столе). В любом случае у нас есть бесконечный цикл. Это конкретное не завершающее условие выделяется, но иногда они не .
Совершенно реальный пример, как в приложении, которое я пишу. Бесконечный поток нулей будет десериализован в бесконечные «пустые» объекты (пока класс коллекции или GC не сгенерируют исключение, потому что я превысил два миллиарда элементов). Но это было бы совершенно неожиданным обстоятельством (учитывая мой источник данных).
Насколько важно не иметь абсолютно никаких не прекращающих условий? Насколько это влияет на «надежность»? Имеет ли значение, если они только «теоретически» не заканчиваются (это нормально, если исключение представляет собой неявное условие завершения)? Имеет ли значение, является ли приложение коммерческим? Если это публично распространяется? Имеет ли значение, если проблемный код никоим образом не доступен через открытый интерфейс / API?
Edit:
Одна из основных проблем, с которыми я сталкиваюсь, - это непредвиденные логические ошибки, которые могут создать неразрывное условие. Если, как правило, вы гарантируете отсутствие не завершающих условий, вы можете более изящно выявлять или обрабатывать эти логические ошибки, но стоит ли это того? И когда? Это проблема, ортогональная доверию.