exponenta event banner

MISRA C:2012 Правило 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- квалифицированный указатель в функции f3 дает защиту времени компиляции значения, возвращенного localeconv но то же самое не верно для строк, на которые он ссылается. Модификация этих строк может быть обнаружена с помощью инструмента анализа.

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

Группа: Стандартные библиотеки
Категория: Обязательно
Категория СМЖЛ: обязательная
Представлен в R2017a