Что переполняет 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
Другие вопросы по тегам