극히 개인적이고 극히 대단하지 않은

localtime()을 localtime_r()로 바꿀 때 주의사항 본문

20년차 개발자

localtime()을 localtime_r()로 바꿀 때 주의사항

회색싼타 2019. 5. 20. 15:00

Thread-unsafe한 특성 때문에 multithread 프로그램을 작성하는 경우에는 localtime()함수대신 localtime_r()함수를 사용하는 것이 안전하다.

기존 소스에 있는 localtime() 함수를 localtime_r()로 바꾸는 경우에 주의해야 할 사항이 있다.

 

localtime() 함수는 struct tm 구조체의 내용을 구하여 그 포인터를 반환하여 주기 때문에 struct tm에 대한 포인터 변수로 그 결과를 받아도 상관없지만, localtime_r() 함수의 경우에는 struct tm의 구조체를 생성한 후, 그 포인터를 함수의 인자로 넣어줘야 하기 때문에 호출 전에 struct tm 실체가 존재하여야 한다.

 

즉.

  struct tm  *myStruct;

  ...

  myStruct = localtime ((time_t *)timep); 

 

위의 코드는 문제가 없으나, 

  struct tm  *myStruct;

  ...

  localtime_r ((time_t *)timep, myStruct); 

 

위의 코드는 정의되지 않은 주소를 localtime_r로 넘겨주기 때문에 문제가 된다.

 

아래처럼 해야 죽지 않는다.

  struct tm  *myStruct;

  ...

  myStruct = malloc(sizeof(struct tm));

  localtime_r ((time_t *)timep, myStruct); 

또는 

  struct tm  myStruct;

  ...

  localtime_r ((time_t *)timep, &myStruct);

기존 소스에 있는 localtime을 기계적으로 localtime_r로 바꿀 때 주의하자.

 

Comments