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

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

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

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

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

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

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

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

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

Например:

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

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

MISRA-C-2023-22.7