- This topic has 1개 답변, 2명 참여, and was last updated 15 years, 1 month 전에 by
ELem. This post has been viewed 1920 times
-
-
putenv()는 환경변수에 값을 추가할 때 사용합니다. putenv()의 문제는 인자로 넘어가는 스트링을 복사해서
환경 변수에 등록하지 않고, 인자로 넘어가는 스트링에 대한 포인터를 환경변수로 설정한다는 점에 있습니다.
만약 putenv()에 인자로 넘어가는 포인터가 스택에 할당된 자동 변수(auto variable)이라면 함수가 반환되면서
메모리가 해제되기 때문에, 환경 변수의 값이 쓰레기값이 되거나, 잘못된 포인터로 인해 문제가 생길 수 있습니다.
나쁜 예:
아래 예에서 TEST 환경변수의 값은 func()를 벗어난 후에는 어떤 값이 될지 알 수 없습니다.
int func(const char *var) { char env[1024]; if (snprintf(env, sizeof(env),"TEST=%s", var) < 0) { /* Handle error */ } return putenv(env); }
좋은예1(putenv()에 동적 할당 메모리 사용)
아래는 putenv에 동작 할당 메모리를 사용하는 예입니다.
int func(const char *var) { static char *oldenv; const char *env_format = "TEST=%s"; const size_t len = strlen(var) + strlen(env_format); char *env = (char *) malloc(len); if (env == NULL) { return -1; } int rc = snprintf(env, len, env_format, var); if (rc < 0 || (size_t)rc >= len) { /* Handle error */ } if (putenv(env) != 0) { free(env); return -1; } if (oldenv != NULL) free(oldenv); /* avoid memory leak */ oldenv = env; return 0; }
좋은예2(setenv()사용)
setenv()를 사용하면, 환경변수를 위해 힙에 메모리를 할당해 인자로 넘어간 스트링을 복사하게 됩니다.
이에 따라 putenv에서 발생하는 문제가 없습니다.
int func(const char *var) { return setenv("TEST", var, 1); }
0 답변 글타래를 보이고 있습니다
0 답변 글타래를 보이고 있습니다
- 답변은 로그인 후 가능합니다.