Подтвердить что ты не робот

Может ли время (NULL) когда-либо возвращать отказ?

Может ли функция time_t time(time_t *t) возвращать сбой, если переданный аргумент всегда равен NULL?

Если вызов time(NULL), нам все еще нужно проверить возвращаемое значение?

Единственным документированным кодом ошибки является EFAULT, относящийся к неверному указателю.

4b9b3361

Ответ 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*.