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

Значение errno должно только быть протестировано, когда последней функцией, которая будет названа, был errno - устанавливающий функцию

Описание

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

Значение errno должно только быть протестировано, когда последней функцией, которая будет названа, был errno - устанавливающий функцию.

Объяснение

Помимо errno - устанавливающие функции, Стандарт не осуществляет тот другой, функции устанавливают errno при ошибках. Устанавливают ли эти функции errno, или не является зависящим от реализации.

Чтобы обнаружить ошибки, если вы проверяете  один только errno, валидность этой проверки также становится зависящей от реализации. На реализациях, которые не требуют установки errno, даже если вы проверяете один только errno, можно пропустить состояние ошибки.

Для списка errno - устанавливающие функции, смотрите MISRA C:2012 Rule 22.8.

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

Значение errno должно только быть протестировано, когда последней функцией, которая будет названа, был errno - устанавливающий функцию.

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

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

Примеры

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

void f ( void )
{
	float64_t f64;
	errno = 0;
	f64 = atof ( "A.12" );
	if ( 0 == errno ) /* Non-compliant */
	{
	}
	errno = 0;
	f64 = strtod ( "A.12", NULL );
	if ( 0 == errno ) /* Compliant */
	{
	}
}

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

  • Первый оператор if несовместим, потому что atof может или не может установить errno, когда ошибка обнаруживается. f64 не может иметь допустимого значения в этом операторе if.

  • Второй оператор if совместим, потому что strtod является errno - устанавливающий функцию. f64 будет иметь допустимое значение в этом операторе if.

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

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

Введенный в R2017a