MISRA C:2012 Rule 22.7

Макро-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