FREEDOM. FRIENDS. FEATURES. FIRST.
페도라 한국 사용자 모임

putenv() vs setenv()

게시판 질문게시판 putenv() vs setenv()

  • This topic has 1개 답변, 2명 참여, and was last updated 10 years, 10 months 전에 by ELem. This post has been viewed 25 times
  • 만든이
    게시글
  • #13053
    enshahar
    참가자
    • 게시글2
    • 댓글1
    • 총합3
    • ★★
    @parresia

    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 답변 글타래를 보이고 있습니다
  • 글쓴이
    답변
    • #14168
      ELem
      참가자
      • 게시글67
      • 댓글672
      • 총합739
      • ★★
      @Bardisch

      감사합니다 ㅎ

0 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.