MISRA C:2012 Rule 21.19

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

Описание

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

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

Это правило прибывает из MISRA C®: 2 012 Поправок 1.

Объяснение

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

    Примечание

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

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

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

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

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