2016-06-26 1 views
0

C++에서 간단한 로깅 클래스를 학습 목적으로 작성했습니다. 내 코드 오늘의 문자열을 반환하는 함수가 포함되어 있습니다. 그러나 'localtime'이 호출 될 때마다 컴파일러 오류가 발생합니다.C++ - 'localtime'이 함수 또는 변수가 안전하지 않을 수 있습니다.

std::string get_date_string(time_t *time) { 
    struct tm *now = localtime(time); 
    std::string date = std::to_string(now->tm_mday) + std::to_string(now->tm_mon) + std::to_string(now->tm_year); 
    return date; 
} 

나는 #define _CRT_SECURE_NO_WARNINGS을 사용해 보았습니다. 그것은 작동하지 않았고 같은 오류가 나타났습니다. 나는 또한 _CRT_SECURE_NO_WARNINGS을 프로젝트 속성의 전 처리기 정의 안에 넣어 보았습니다. 이로 인해 해결되지 않은 외부 오류가 발생했습니다.

누구에게 할 일이 있습니까?

+0

처럼 : 여기

내가 (테스트되지 않은 Windows에서) 무엇입니까? 'localtime'은 소유하고있는 메모리 영역에 대한 포인터를 반환하기 때문에 위험 할 수 있습니다. 그래서 여러 번 호출하면 구조체를 복사 할 때마다 반드시 확인해야합니다. 또한, 그런데, 당신이 문자열을 만드는 방법, 만약 당신이 "2112016"을 얻는다면 그것은 21/1/2016인지 2/11/2016인지 당신은 모른다. –

답변

1

시도를 #include 전에 다른 헤더 파일을 다음 코드 정확한 경고 메시지가

#define _CRT_SECURE_NO_WARNINGS 
#include <ctime> 
//your code 
2

std::localtime은 정적 버퍼 (스레드간에 공유 됨)를 사용하기 때문에 스레드 안전성이 없다는 점이 문제입니다. POSIXWindows 모두 안전한 대안을 가지고 있습니다 : localtime_rlocaltime_s. #define _CRT_SECURE_NO_WARNINGS

inline std::tm localtime_xp(std::time_t timer) 
{ 
    std::tm bt {}; 
#if defined(__unix__) 
    localtime_r(&timer, &bt); 
#elif defined(_MSC_VER) 
    localtime_s(&bt, &timer); 
#else 
    static std::mutex mtx; 
    std::lock_guard<std::mutex> lock(mtx); 
    bt = *std::localtime(&timer); 
#endif 
    return bt; 
} 

// default = "YYYY-MM-DD HH:MM:SS" 
inline std::string time_stamp(const std::string& fmt = "%F %T") 
{ 
    auto bt = localtime_xp(std::time(0)); 
    char buf[64]; 
    return {buf, std::strftime(buf, sizeof(buf), fmt.c_str(), &bt)}; 
} 
+1

Windows에서 테스트되었으며 정상적으로 작동합니다. –