mktime溢出了什么参数?

时间:2011-11-05 22:32:12

标签: c overflow mktime

根据标准,mktime应该执行标准化 - 当您想要向struct tm添加一分半时,您需要向tm_sec添加90秒并致电mktime ,忽略其回报价值。

我在标准中未找到的是参数是否已标准化,即使它无法在time_t中表示(例如将年份设置为2100)。

那么,这段代码安全吗?

struct tm future;
memset(&future, 0, sizeof(future));
future.tm_mon = 1;
future.tm_sec = 90;   //I want this to be normalised by mktime
future.tm_year = 200; //but this can cause troubles

mktime(&future);

//future.tm_sec should be 30
//future.tm_min should be 1
//future.tm_year should be still 200

2 个答案:

答案 0 :(得分:1)

C标准对此有mktime()

  

成功完成后,结构的tm_wdaytm_yday组件的值会相应设置,并且   其他组件设置为表示指定的日历时间,但是   他们的价值被迫达到上述范围;决赛   tm_mdaytm_mon之前未设置tm_year的值   确定。

因此,如果函数成功完成,您只能依赖正在执行的规范化。

答案 1 :(得分:0)

您需要检查mktime的返回值。 你不应该忽略库函数的返回值!printf的例外情况和其他很少的情况)。

如果它返回(time_t)-1,则结果不值得信任。

请参阅http://codepad.org/KTZwUHt0

上的示例

我电脑上的相同代码打印

time_t is 64 bits long
normalized to 2100-01-31 T 00:01:30