MISRA C:2012 Rule 21.20

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

Описание

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

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

Это правило прибывает из MISRA C®: 2 012 Поправок 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