Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: Статический анализ и ASOC: нулевая терпимость к ошибкам в проекте - 13.11

>
>
>
V2663. MISRA. The macro EOF should...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

24 Окт 2025

Диагностическое правило основано на руководстве 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();
  //....
}