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();
//....
}