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

putenv() vs setenv()

게시판 Tech/Tip putenv() vs setenv()

  • This topic has 1개 답변, 2명 참여, and was last updated 15 years, 1 month 전에 by
    ELem. This post has been viewed 1920 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
      참가자
        게시글74 댓글709 총합783
      @Bardisch
       

      감사합니다 ㅎ

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

지금 이 순간


반갑습니다! 앞으로 많은 지도와 편달을 부탁드립니다.
F33에서 재미삶아 사용하는 간편 하드웨어 정보확인
꾸뻑~
가입했습니다.
vnc 설치와 접속에 대해서 문의 드립니다. ㅜㅜ
페도라 14 commend 에 관해서..질문!!
루트권한으로 startx하면 페도라 배경화면에서 마우스가 안움직여져요
안녕하세요
vm에서 인터넷이 안됩니다.
Fedora 31 Server KDE System