ПроблемаИзменение внутреннего буфера, возвращенного из не входящей стандартной функции, происходит, когда происходит следующее:
Невходящая стандартная функция возвращает указатель.
Вы пытаетесь записать в место памяти, на которое указывает указатель мыши.
Невходящие стандартные функции, которые возвращают не 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);
}
}