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

Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08

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

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

  • MISRA-C-2023-Rule-22.7

Ты поймал бага за сек!
А мы в коде ловим их за доли секунды. Хочешь проверить?

Попробовать бесплатно