MISRA C:2012 Rule 21.19

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

Описание

Определение правила

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

Это правило получено от MISRA C®: 2012 1 о внесении изменений.

Объяснение

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

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <locale.h>
#include <string.h>

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

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

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

В приведенном выше примере:

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

    Примечание

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

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

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

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

Группа: Стандартные библиотеки
Категория: Обязательная
Категория AGC: Обязательно
Введенный в R2017a