2011-11-05 94 views
0

根据标准,mktime应该进行归一化 - 当你想一分半钟添加到struct tm,你加90秒的tm_sec并调用mktime,而忽略它的返回值。什么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 
+0

在调用'mktime'之后,你不能只将200赋给'tm_year'吗? –

+0

我不认为这一年可能是1900年前的任何事 –

+0

K-ballo:因为我将不得不处理闰年(例如,在向2008-02_28添加几个小时时) –

回答

1

C标准已经这样说mktime()

成功完成时,该结构的tm_wdaytm_yday组件的值被适当地设置,并且 其他组件设置为表示指定的日历时间,但 的值被强制设置为上述范围;最终的 值tm_mday没有设置,直到tm_montm_year都是 确定。

所以,你只能依靠正在执行的规范化,如果功能成功完成。

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
+0

我知道在这种情况下mktime会溢出。问题是如果指向的结构包含规范化的数据 - 我没有看到规范化的任何逻辑问题。 –

+0

[The Standard](http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)非常明确,明确避免描述“mktime”未完成时的行为转换:“7.23.2.3/2:...成功完成...”。所以,我认为,实现可以自由地做任何他们想做的事情。 – pmg