﻿# Бесконечный цикл

Бесконечный цикл \(infinite loop\) \- это цикл, условие выхода из которого никогда не выполняется\. Следует различать бесконечные циклы, написанные специально и получившиеся вследствие программной ошибки\. 

Дальше речь пойдет о бесконечных циклах, получившихся из\-за ошибок в программах, написанных на языке программирования Си/Си\+\+\.

Рассмотрим первый пример такой программной ошибки\.

```cpp
void CXmlReader::UnsafePutCharsBack(
  const TCHAR* pChars, size_t nNumChars)
{
  if (nNumChars == 0)
    return;
  for (size_t nCharPos = nNumChars - 1;
       nCharPos >= 0;
       --nCharPos)
    UnsafePutCharBack(pChars[nCharPos]);
}
```

В данном примере условие 'nCharPos \>\= 0' всегда истинно, поскольку переменная nCharPos имеет тип [size\_t](https://pvs-studio.ru/ru/blog/terms/0044/)\. Это беззнаковый тип, а значит переменная всегда больше или равна нулю\. Именно поэтому цикл оказывается бесконечным\.



Рассмотрим еще один пример цикла, который может оказаться бесконечным\.

```cpp
size_t n;
unsigned i;
for (i = 0; i != n; ++i)
{
  ...
}
```

В данном случае ошибка может проявляться на 64\-битной платформе, если количество обрабатываемых элементов превысит UINT\_MAX \(4294967295\)\. Если переменная 'n' больше UINT\_MAX \(4294967295\), то условие 'i \!\= n' всегда будет истинным\. На очередном шаге произойдет переполнение, и переменная 'i' вновь станет равна нулю\. Переменная 'i' никогда не достигнет значения, равного значению переменной 'n'\. 

_Примечание\. Описанный вид [64\-битной ошибки](https://pvs-studio.ru/ru/blog/terms/0002/) весьма коварен\. Дело в том, что оптимизирующий компилятор иногда строит цикл, который заканчивается\. В результате ошибка становится плавающей и проявляет себя в зависимости от настроек компилятора и иных факторов\. Подробнее этот интересный момент описан в статье "[64\-битный конь, который умеет считать](https://pvs-studio.ru/ru/blog/posts/cpp/a0043/)"\._

Наиболее эффективно такие ошибки можно диагностировать еще на этапе написания программы с использованием инструментов статического анализа кода\.

## Библиографический список

1. Wikipedia\. [Бесконечный цикл](https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D1%86%D0%B8%D0%BA%D0%BB)\.
1. [Implicit type conversion to memsize type in an arithmetic expression](https://pvs-studio.ru/ru/docs/warnings/v104/)\.