Правило 22.7 MISRA C:2012

Макро-EOF должен только быть по сравнению с неизмененным возвращаемым значением от любой Стандартной Библиотечной функции, способной к возврату EOF

Описание

Управляйте определением

Макро-EOF должен только быть по сравнению с неизмененным возвращаемым значением от любой Стандартной Библиотечной функции, способной к возврату EOF.

Объяснение

Значение EOF может стать неотличимым от кода допустимого символа, если возвращенное значение преобразовано в другой тип. В таких случаях, тестируя конвертированное значение против EOF надежно не идентифицирует, был ли конец файла достигнут или если ошибка произошла.

Обменивайтесь сообщениями в отчете

Макро-EOF должен только быть по сравнению с неизмененным возвращаемым значением от любой Стандартной Библиотечной функции, способной к возврату EOF.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

void f1 ( void )
{
	char ch;
	ch = ( char ) getchar ();
	if ( EOF != ( int32_t ) ch )  /* Non-compliant */
	{
	}
}

void f2 ( void )
{
	char ch;
	ch = ( char ) getchar ();
	if ( !feof ( stdin ) )        /* Compliant */
	{
	}
}

void f3 ( void )
{
	int32_t i_ch;
	i_ch = getchar ();
	if ( EOF != i_ch )            /* Compliant */
 	{
		char ch;
		ch = ( char ) i_ch;
	}
}

В этом примере:

  • Тест в функции f1 несовместим. Это не будет надежно, когда возвращаемое значение брошено к более узкому типу прежде, чем проверять на EOF.

  • Тест в функции f2 совместим. Это показывает, как feof() может использоваться, чтобы проверять на EOF, когда возвращаемое значение от getchar() было подвергнуто преобразованию типов.

  • Тест в функции f3 совместим. Это надежно, когда неконвертированное возвращаемое значение используется при проверке на EOF.

Проверяйте информацию

Группа: ресурсы
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2017a