Что переполняет mktime с параметром? - PullRequest
0 голосов
/ 06 ноября 2011

В соответствии со стандартом, mktime должен выполнить нормализацию - когда вы хотите добавить полторы минуты к struct tm, вы добавляете 90 секунд к tm_sec и вызываете 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 ]

1 голос
/ 06 ноября 2011

Стандарт C имеет это сказать о mktime():

При успешном завершении значения компонентов tm_wday и tm_yday структуры устанавливаются соответствующим образом, и другие компоненты установлены для представления указанного календарного времени, но с их значениями, приведенными к диапазонам, указанным выше; финал значение tm_mday не устанавливается до тех пор, пока tm_mon и tm_year не станут определена.

Таким образом, вы можете рассчитывать на выполнение нормализации только в случае успешного завершения функции.

0 голосов
/ 06 ноября 2011

Вам необходимо проверить возвращаемое значение mktime. Не следует игнорировать возвращаемое значение из библиотечных функций! (исключение составляет printf и (не так) несколько других).

Если оно возвращает (time_t)-1, результат не заслуживает доверия.

См. Пример на http://codepad.org/KTZwUHt0

Тот же код на моем компьютере печатает

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