exponenta event banner

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

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

Описание

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

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

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

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

Поиск неисправностей

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

Примеры

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

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

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 функция выполняется перед использованием.

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

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