C ++ - «локальное время» эта функция или переменная может быть небезопасной

Я пишу простой класс ведения журнала на 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 внутри определения препроцессора в свойствах проекта. Это дало неразрешенную внешнюю ошибку.

У кого-нибудь есть идеи, что делать?

 Ben11 апр. 2018 г., 13:40
Не используйте эту функцию по причине, указанной в предупреждении.
 Klitos Kyriacou26 июн. 2016 г., 02:14
Где точное предупреждающее сообщение?localtime может быть опасно использовать, потому что он возвращает указатель на область памяти, которой он владеет, поэтому, если вы вызываете его несколько раз, вы должны проверять это каждый раз, когда копируете структуру. Кроме того, кстати, как вы создаете строку, если вы получаете «2112016», вы не знаете, будет ли это 21/1/2016 или 2/11/2016.

Ответы на вопрос(2)

Проблема в том, чтоstd::localtime не является потокобезопасным, поскольку использует статический буфер (совместно используемый потоками). И то и другоеPOSIX а такжеWindows есть безопасные альтернативы:localtime_r а такжеlocaltime_s.

Вот что я делаю:

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)};
}
 Guney Ozsan29 янв. 2018 г., 13:53
Проверено на Windows и работает отлично.
 elven_inside11 апр. 2018 г., 13:18
лучший ответ, чем выбранный
Решение Вопроса

Пробовать#define _CRT_SECURE_NO_WARNINGS до#include любые другие заголовочные файлы, например, следующий код

#define _CRT_SECURE_NO_WARNINGS
#include <ctime>
//your code
 Ben11 апр. 2018 г., 13:40
Не делайте этого. Вместо этого отнеситесь к предупреждению безопасности ЭЛТ серьезно!

Ваш ответ на вопрос