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

Указатель, возвращенный Стандартными Библиотечными функциями asctime, ctime, gmtime, localtime, localeconv, getenv, setlocale или strerror, не должен использоваться после последующего вызова той же функции

Описание

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

Указатель, возвращенный Стандартными Библиотечными функциями asctime, ctime, gmtime, localtime, localeconv, getenv, setlocale или strerror, не должен использоваться после последующего вызова той же функции.

Объяснение

Предыдущие функции возвращают указатель на объект в Стандартной Библиотеке. Реализация для этого объекта может использовать статический буфер, который может быть изменен вторым вызовом той же функции. Поэтому значение получило доступ через указатель, прежде чем последующий вызов той же функции сможет неожиданно измениться.

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

Указатель, возвращенный Стандартными Библиотечными функциями asctime, ctime, gmtime, localtime, localeconv, getenv, setlocale или strerror, не должен использоваться после последующего вызова той же функции.

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

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

Примеры

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

void f1( void )
{
		const char *res1;
		const char *res2;
		char copy[ 128 ];
		res1 = setlocale ( LC_ALL, 0 );
		( void ) strcpy ( copy, res1 );
		res2 = setlocale ( LC_MONETARY, "French" );
		printf ( "%s\n", res1 ); /* Non-compliant */
		printf ( "%s\n", copy ); /* Compliant */
		printf ( "%s\n", res2 ); /* Compliant */
}

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

  • Первый оператор printf несовместим, потому что указатель, возвращенный setlocale, используется после последующего вызова его, когда res2 присвоен.

  • Второй оператор printf совместим, потому что операция копии, выполняемая strcpy, сделана, прежде чем последующий вызов функции setlocale выполняется.

  • Третий оператор printf совместим, потому что нет никакого последующего вызова функции setlocale, сделан перед использованием.

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

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

Введенный в R2017a