2011-11-05 83 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