ISO/IEC TS 17961 [libmod]

Изменяя строку, возвращенную getenv, localeconv, setlocale, и strerror

Описание

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

Изменяя строку, возвращенную getenv, localeconv, setlocale, и strerror. [1]

Примеры

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

Описание

Модификация внутреннего буфера, возвращенного в неповторно используемую стандартную функцию, происходит, когда следующее происходит:

  • Неповторно используемая стандартная функция возвращает указатель.

  • Вы пытаетесь записать в ячейку памяти, что указатель указывает на.

Неповторно используемые стандартные функции, которые возвращают не const - квалифицированный указатель на внутренний буфер, включают getenv, getlogin, crypt, setlocale, localeconv, strerror и других.

Риск

Изменение внутреннего буфера, что неповторно используемая стандартная функция возвраты может вызвать следующие проблемы:

  • Возможно, что модификация не следует или изменяет другие внутренние данные.

    Например, getenv возвращает указатель на значение переменной окружения. Если вы изменяете это значение, вы изменяете среду процесса и повреждаете другие внутренние данные.

  • Даже если модификация успешно выполняется, возможно, что последующий вызов той же стандартной функции не возвращает ваше измененное значение.

    Например, вы изменяете значение переменной окружения, которое возвращает getenv. Если другой процесс, поток или обработчик сигнала вызывают setenv, измененное значение перезаписывается. Поэтому последующий вызов getenv не возвращает ваше измененное значение.

Фиксация

Постарайтесь не изменять внутренний буфер с помощью указателя, возвращенного в функцию.

Пример - модификация возвращаемого значения getenv

#include <stdlib.h>
#include <string.h>

void printstr(const char*);

void func() {
    char* env = getenv("LANGUAGE");
    if (env != NULL) {
        strncpy(env, "C", 1);
        printstr(env);
    }
}

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

Исправление - копирует возвращаемое значение getenv и изменяет копию

Одно возможное решение состоит в том, чтобы скопировать возвращаемое значение getenv и передать копию функции strncpy.

#include <stdlib.h>
#include <string.h>
enum {
    SIZE20 = 20
};

void printstr(const char*);

void func() {
    char* env = getenv("LANGUAGE");
    if (env != NULL) {
        char env_cp[SIZE20];
        strncpy(env_cp, env, SIZE20);  
        strncpy(env_cp, "C", 1);        
        printstr(env_cp);
    }
}

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

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.