Что переполняет mktime с параметром?
Согласно стандарту, 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 ответа
Стандарт C имеет это сказать о mktime()
:
После успешного завершения значения
tm_wday
а такжеtm_yday
компоненты структуры устанавливаются соответствующим образом, а другие компоненты задаются так, чтобы представлять указанное календарное время, но с их значениями, установленными в диапазонах, указанных выше; окончательное значениеtm_mday
не установлен доtm_mon
а такжеtm_year
определены.
Таким образом, вы можете рассчитывать на выполнение нормализации только в случае успешного завершения функции.
Вам нужно проверить возвращаемое значение mktime
, Вы не должны игнорировать возвращаемое значение из библиотечных функций! (исключение для printf
и (не так) несколько других).
Если он вернется (time_t)-1
результат не заслуживает доверия.
Смотрите пример на http://codepad.org/KTZwUHt0
Тот же код на моем компьютере печатает
time_t длиной 64 бита нормализуется до 2100-01-31 T 00:01:30