>
>
>
V663. Infinite loop is possible. The 'c…


V663. Infinite loop is possible. The 'cin.eof()' condition is insufficient to break from the loop. Consider adding the 'cin.fail()' function call to the conditional expression.

Анализатор обнаружил потенциальную ошибку, из-за которой может возникнуть бесконечный цикл. При работе с классом 'std::istream' недостаточно вызова функции 'eof()' для завершения цикла. В случае возникновения сбоя при чтении данных, вызов функции 'eof()' будет всегда возвращать значение 'false'. Для завершения цикла в этом случае необходима дополнительная проверка значения, возвращаемого функцией 'fail()'.

Рассмотрим пример некорректного кода:

while (!cin.eof())
{
  int x;
  cin >> x;
}

Исправить ошибку можно усложнив условие. Корректный вариант кода:

while (!cin.eof() && !cin.fail())
{ 
  int x;
  cin >> x;
}

Впрочем, у этого варианта тоже есть недостатки. Наиболее простой и правильный вариант кода выглядит так:

int x;
while(cin >> x) {
  ....;
}

Подробно вопрос чтения из потока разбирается здесь: Why is iostream::eof inside a loop condition (i.e. 'while (!stream.eof())') considered wrong?

Данная диагностика классифицируется как:

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V663.