exponenta event banner

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

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

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