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

Указатели, возвращенные Стандартными Библиотечными функциями, localeconv, getenv, setlocale или strerror должны только использоваться, как будто у них есть указатель на const - квалифицированный тип

Описание

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

Указатели, возвращенные Стандартными Библиотечными функциями, localeconv, getenv, setlocale или strerror должны только использоваться, как будто у них есть указатель на const - квалифицированный тип.

Объяснение

Стандарт C99 утверждает, что, если программа изменяет структуру, на которую указывает значение, возвращенное localeconv или строками, возвращенными getenv, setlocale или strerro, неопределенное поведение происходит. Обработка указателей, возвращенных различными функциями, как будто они были const - квалифицированный, позволяет аналитическому инструменту обнаруживать любую попытку изменить объект через один из указателей. При присвоении возвращаемых значений функций к const - квалифицированные указатели приводят к компилятору, выпуская диагностику, если попытка предпринята, чтобы изменить объект.

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

Указатели, возвращенные Стандартными Библиотечными функциями, localeconv, getenv, setlocale или strerror должны только использоваться, как будто у них есть указатель на const - квалифицированный тип.

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

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

Примеры

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

void f1 ( void )
{
		char *s1 = setlocale ( LC_ALL, 0 ); /* Non-compliant */
		struct lconv *conv = localeconv (); /* Non-compliant */
		s1[ 1 ] = 'A'; /* Undefined behavior */
		conv->decimal_point = "^"; /* Undefined behavior */
}

void f2 ( void )
{
		char str[128];
		(void) strcpy (str, setlocale ( LC_ALL,0 ) ); /* Compliant */
		const struct lconv *conv = localeconv ();     /* Compliant */
		conv->decimanl_point = "^"                    /* Constraint violation */
}

void f3 ( void )
{
const struct lconv *conv = localeconv (); /* Compliant */
conv->grouping[ 2 ] = 'x';                /* Non-compliant */
}

В вышеупомянутом примере:

  • Использование setlocale и localeconv в функциональном f1 несовместимо, когда возвращенные указатели присвоены non-const — квалифицированные указатели.

    Примечание

    Использование setlocale и localeconv выше не является ограничительными нарушениями и не будет поэтому сообщаться компилятором. Однако аналитический инструмент сможет сообщить о нарушении.

  • Использование setlocale в функциональном f2 совместимо, когда strcpy берет const char * в качестве своего второго параметра. Использование localeconv в функциональном f2 совместимо, когда возвращенные указатели присвоены const - квалифицированный указатель. О любой попытке изменить объект через указатель сообщат компилятор или аналитический инструмент, когда это - ограничительное нарушение.

  • Использование const - квалифицированный указатель в функциональном f3 дает защиту времени компиляции значения, возвращенного localeconv, но то же самое не верно для строк, на которые это ссылается. Модификация этих строк может быть обнаружена аналитическим инструментом.

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

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

Введенный в R2017a