Может ли время (NULL) когда-либо возвращать отказ?
Может ли функция time_t time(time_t *t)
возвращать сбой, если переданный аргумент всегда равен NULL?
Если вызов time(NULL)
, нам все еще нужно проверить возвращаемое значение?
Единственным документированным кодом ошибки является EFAULT, относящийся к неверному указателю.
Ответы
Ответ 1
Да. time
имеет зарегистрированный случай сбоя:
Функция time() может выйти из строя, если:
[EOVERFLOW] Число секунд, с тех пор как Epoch не будет помещаться в объект типа time_t.
Источник: http://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html
Ожидайте, что это произойдет на практике примерно через 22 года, не раньше, а не на 64-битных системах или 32-разрядных, которые используют 64-разрядный time_t
.
Кроме того, наличие каких-либо ошибок или сбоев также допускает ошибки, определенные при реализации, хотя их существование будет серьезным недостатком качества реализации.
EFAULT
не является проблемой/не существует, потому что это происходит только тогда, когда ваша программа имеет поведение undefined.
Поэтому, несмотря на все это, в реальном мире time
на самом деле не сработает.
Ответ 2
Может ли время (NULL) возвращать отказ?
Нет. C говорит, что
C11: 7.27.2.4:
Функция времени возвращает наилучшее приближение реализаций к текущему календарному времени. Значение (time_t)(-1)
возвращается, если время календаря недоступно.
Ответ 3
Я проверил RHEL, SLES и UBTU; man 2 page дает ту же самую (релевантную) вещь:
time() returns the time since the Epoch (00:00:00 UTC, January 1, 1970), measured in seconds.
If t is non-NULL, the return value is also stored in the memory pointed to by t.
В любом случае, возвращаясь к исходным вопросам
-
Q0: может ли функция time_t time(time_t *t)
возвращать сбой, если переданный аргумент всегда равен NULL?
- A/R0: Да, если произошли некоторые особые события (полная память и т.д.,...)
-
Q1: Если время вызова (NULL), нужно ли нам еще проверять возвращаемое значение?
- A/R1: фактический ответ "НЕТ", вам не нужно; тот факт, что func может вернуть что-то актуальное, - это совсем другая история. В конце концов, зачем звонить func, если нет необходимости делать это?
-
Q2: Единственный зарегистрированный код ошибки - EFAULT
, относящийся к неверному указателю.
- Вы не имеете никакого отношения к неверным кодам; как вы сказали, вы проходите
NULL
, поэтому проблем нет.
Ответ 4
В стандарте C time()
может возвращать (time_t)(-1)
, если "время календаря недоступно". Например, в стандарте 1999 года, например, в разделе 7.23.2.4, пункт 3.
Хотя эта формулировка меньше конкретной, я бы предположил, что она представляет собой условие ошибки. Предположительно, реализация может вернуть (time_t)(-1)
, если она не может получить доступ к системным часам, не может разумно интерпретировать полученные данные и т.д.
R ответ описывает, что имеет место для спецификации posix.
Ответ 5
(Не учитывать функции ухудшенного режима POSIX)
Если базовая подсистема часов реального времени имела аппаратную ошибку, такую как потеря целостности часов (батареи), когда блок был отключен в независимой системе, возвращаемое значение time()
могло бы быть (time_t) -1
. В этом случае не имеет значения, что было передано в time_t*
.