localtime和asctime是不安全的,但安全功能没有相同的参数

时间:2013-07-31 22:52:31

标签: c++ security c++11 time localtime

我正在尝试为我的程序创建时间戳。在我姐姐的Mac上(使用Xcode 4.2),这段代码非常合适:

struct tm * timeInfo;
time_t rawtime;
time (&rawtime);
timeInfo = localtime (&rawtime);
string timestamp(asctime(timeInfo));

但是,在运行Visual Studio 2012的PC上,我收到localtime和asctime的错误,告诉我它们是不安全的函数,它建议使用localtime_s和asctime_s。但是,功能参数不同。我尽力研究这些功能,但我无法让它发挥作用。

非常感谢任何有助于实现这一目标的帮助。

编辑:

struct tm * timeInfo;
time_t rawtime;
time (&rawtime);
timeInfo = localtime_s (&rawtime);
string timestamp(asctime_s(timeInfo));

1 个答案:

答案 0 :(得分:4)

这些功能具有不同参数的原因是缺少安全性是由于只有一个参数。特别是,asctime()使用单个缓冲区来返回时间。所以,如果你做了类似的事情:

char *s1 = asctime((time_t)0);   // 1-Jan-1970 00:00:00 or something like that. 
time_t t = time();
char *s2 = asctime(t);
cout << "1970: " << s1 << " now:" << s2 << endl;

然后您将看不到打印两个不同的时间,但当前时间打印两次,因为s1s2都指向相同的字符串。

同样适用于localtime,它返回指向struct tm的指针 - 但它总是相同struct tm,所以如果你这样做:

struct tm* t1 = localtime(0);
struct tm* t2 = localtime(time()); 

您将在t1t2中获得相同的值(“当前”时间,而非1970年)。

因此,要解决此问题,asctime_slocaltime_s会有一个额外的参数用于存储数据。 asctime_s还有第二个额外参数来告诉函数存储缓冲区中有多少空间,否则,它可能会溢出该缓冲区。