C++ - 'localtime' 这个函数或变量可能不安全

Posted

技术标签:

【中文标题】C++ - \'localtime\' 这个函数或变量可能不安全【英文标题】:C++ - 'localtime' this function or variable may be unsafeC++ - 'localtime' 这个函数或变量可能不安全 【发布时间】:2016-10-28 06:59:36 【问题描述】:

出于学习目的,我正在用 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 放在项目属性的预处理器定义中。这给出了一个未解决的外部错误。

有没有人知道该怎么做?

【问题讨论】:

确切的警告信息在哪里? localtime 使用起来可能很危险,因为它返回一个指向它拥有的内存区域的指针,所以如果你多次调用它,你需要确保每次复制结构时都需要。另外,顺便说一下,你创建字符串的方式,如果你得到“2112016”,你不知道那是 21/1/2016 还是 2/11/2016。 请勿使用此功能,原因在警告中给出。 【参考方案1】:

问题在于std::localtime 不是线程安全的,因为它使用静态缓冲区(在线程之间共享)。 POSIXWindows 都有安全的替代方案: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);

【讨论】:

比选择的答案更好【参考方案2】:

#include 之前尝试#define _CRT_SECURE_NO_WARNINGS 任何其他头文件,如以下代码

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

【讨论】:

不要这样做。而是认真对待 CRT 安全警告!

以上是关于C++ - 'localtime' 这个函数或变量可能不安全的主要内容,如果未能解决你的问题,请参考以下文章

从函数调用传递参数或从变量传递参数之间的 C++ 区别

localtime vs localtime_s 和适当的输入参数

C语言关于localtime_s()和asctime_s()两个函数的用法。

C++编码优化之减少冗余拷贝或赋值

Java 的普通函数中可以用static修饰变量吗,就像c++一样,或者matlab的persistent变量?

C++编码优化之减少冗余拷贝或赋值