exponenta event banner

Изменение внутреннего буфера, возвращаемого из нестандартной стандартной функции

Функция пытается изменить внутренний буфер, возвращенный из неинтенсивной стандартной функции

Описание

Этот дефект возникает в следующих случаях:

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

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

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

Риск

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

  • Возможно, что изменение не будет успешным или изменит другие внутренние данные.

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

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

    Например, можно изменить значение переменной среды, getenv возвращает. Если вызывается другой процесс, поток или обработчик сигналов setenvизмененное значение перезаписывается. Следовательно, последующий вызов 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);
    }
}

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: WRITE_INTERNAL_BUFFER_RETURNED_FROM_STD_FUNC
Воздействие: Низкий
CWE ID: 573, 628
Представлен в R2015b