【问题标题】:Can time(NULL) ever return failure?time(NULL) 可以返回失败吗?
【发布时间】:2016-03-22 02:06:56
【问题描述】:

如果传递的参数始终为 NULL,time_t time(time_t *t) 函数能否返回失败?

如果调用的是time(NULL),还需要检查返回值吗?

唯一记录的错误代码是 EFAULT,它与指针无效有关。

【问题讨论】:

  • @user3159253 它可能会在time((time_t*)junk) 的情况下返回 EFAULT,以获得一些垃圾值。虽然在能够返回 EFAULT 的时候,我已经考虑过程序行为被没收。
  • 对于一些垃圾。这个问题似乎没有实际意义,但是.. 嗯,让律师来吧。
  • @user3159253 与出名无关(尽管这使得它成为一个非常实际的选择);如果它被编入函数契约,它可以是任何值 (**)。
  • 对于给定的平台?不,对于给定的平台,NULL 指针是完全确定的。但可以肯定的是,它可能是 != 0
  • 好吧,根本没有 EFAULT。在 Linux-specific time() implementation in GLIBC 和 FreeBSD 中都没有 gettimeofday

标签: c time posix


【解决方案1】:

在 C 标准中,如果“日历时间不可用”,time() 可以返回 (time_t)(-1)。例如,在 1999 年标准中,即第 7.23.2.4 节第 3 段。

虽然该措辞不够具体,但我建议它代表一种错误情况。假设一个实现可以返回(time_t)(-1),如果它不能访问系统时钟,不能明智地解释它得到的数据,等等。

R 的回答描述了 posix 规范的情况。

【讨论】:

  • 很久以前,在VMS上,系统时钟是本地时间。直到很久以后,当操作系统获得时区支持时,time() 总是返回 -1。
【解决方案2】:

time(NULL) 可以返回失败吗?

没有。 C标准说

C11:7.27.2.4:

时间函数返回当前日历时间的最佳近似值。如果日历时间不可用,则返回值(time_t)(-1)

【讨论】:

  • 我猜(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如果传递的参数始终为 NULL,time_t time(time_t *t) 函数能否返回失败?

    • A/R0是的,如果发生了一些非常特殊的事件(内存已满,等等……)
  • Q1如果调用的是time(NULL),还需要检查返回值吗?

    • A/R1:实际答案是“否”,您不必这样做; func 可以返回相关内容的事实是另一回事。毕竟,如果不需要,为什么要调用 func 呢?
  • Q2唯一记录的错误代码是EFAULT,这与指针无效有关。

    • 无效代码与您无关;正如你所说,你通过NULL,所以没有问题。

【讨论】:

    【解决方案4】:

    (不考虑 POSIX 降级模式功能)

    如果底层实时时钟子系统在独立系统上关闭时出现时钟完整性(电池)丢失等硬件故障,time() 的返回值肯定是(time_t) -1。在这种情况下,time_t* 中传递的内容没有区别。

    【讨论】:

      【解决方案5】:

      是的。 time 有一个记录在案的可能失败案例:

      如果出现以下情况,time() 函数可能会失败:

      [EOVERFLOW] 自 Epoch 以来的秒数将不适合 time_t 类型的对象。

      来源:http://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html

      预计这会在大约 22 年之后在实践中发生,而且不会很快发生,而且不会在 64 位系统或使用 64 位 time_t 的 32 位系统上发生。

      此外,任何 shall failmay fail 情况的存在也允许实现定义的错误,尽管它们的存在将是一个严重的实现质量缺陷.

      EFAULT 不存在/不存在,因为它仅在您的程序具有未定义行为时发生。

      尽管如此,在现实世界中,time 实际上并不会失败。

      【讨论】:

      • 这对 posix 来说很好,但记录的细节不是标准的 C。
      • @Peter:这个问题被标记为 posix。
      • 和C,R。它适用于一个但不适用于另一个。因此我的评论。
      • "很快"...如果您假设机器的时钟是正确的 ;)
      猜你喜欢
      • 2012-07-06
      • 2016-10-17
      • 2010-11-10
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多