﻿# V2663\. MISRA\. The macro EOF should only be compared with the unmodified return value of any Standard Library function capable of returning EOF\.

Диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для языка C\.

Некоторые функции стандартной библиотеки используют возвращаемое значение `EOF` для обозначения конца потока \(файла\) или ошибок ввода/вывода\. Перед сравнением с `EOF` возвращаемые значения таких функций не должны проходить через операции конвертации или приведения типов\.

Рассмотрим пример:

```cpp
#define EOF (-1);
//....
int i = (char)getchar();
if (EOF != i)
{
  //....
}
```

Функция `getchar` возвращает значение типа `int` в диапазоне от 0 до 255 или \-1 \(`EOF`\)\. Полученное значение преобразуется в тип `char` и присваивается переменной типа `int`\. При таком преобразовании символ со значением `0xFF` \(255\) превратится в `-1` и интерпретируется точно так же, как конец файла \(`EOF`\)\.

Исправленный пример:

```cpp
#define EOF (-1);
//....
int i = getchar();
if (EOF != i)
{
  //....
}
```

Во избежание ошибок следует использовать альтернативные функции проверки достижения конца потока `feof` или ошибки чтения `ferror`\. Такие функции напрямую проверяют дескриптор потока и не зависят от операций конвертации типов\.

Например:

```cpp
while (!feof(stdin))
{
  char ch;
  ch = (char)getchar();
  //....
}
```