Modification of internal buffer returned from nonreentrant standard function

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

Описание

Этот дефект возникает, когда происходит следующее:

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

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

Невходящие стандартные функции, которые возвращают не const-квалифицированный указатель на внутренний буфер включает 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++
По умолчанию: Off
Синтаксис командной строки: WRITE_INTERNAL_BUFFER_RETURNED_FROM_STD_FUNC
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 573, 628
Введенный в R2015b