【发布时间】:2017-09-26 15:14:40
【问题描述】:
UBSAN 在我运行 antiword 实用程序时抱怨未定义的行为:
runtime error: left shift of 1 by 63 places cannot be represented in type 'time_t' (aka 'long')
错误是由下面的TIME_T_MIN 和TIME_T_MAX 的宏触发的。
#if !defined(TIME_T_MIN)
#define TIME_T_MIN ((time_t)0 < (time_t)-1 ?\
(time_t)0 :\
(time_t)1 << (sizeof(time_t) * CHAR_BIT - 1))
#endif /* TIMER_T_MIN */
#if !defined(TIME_T_MAX)
#if defined(__TURBOC__) /* Turbo C chokes on the subtraction below */
#define TIME_T_MAX (LONG_MAX)
#else /* All others */
#define TIME_T_MAX (~(time_t)0 - TIME_T_MIN)
#endif /* __TURBOC__ */
#endif /* TIME_T_MAX */
我联系了 antiword 作者,他建议我找到一种替代方法来导出 time_t 的最小值/最大值。
如果您不确定底层类型是什么,计算time_t 的最小值/最大值的跨平台方法是什么?
【问题讨论】:
-
我不认为有一个通用的方法,因为标准没有指定关于底层类型的 anything。顺便说一句,有很多重复。
-
天哪,这是一个旧软件!我隐约记得当时在 Linux 上运行它。看到 RISC OS 部分声明 Antiword“是 26/32 位中性”也很酷。 :) 我认为最好的办法是深入研究并找出为什么它想要在一段时间内获得最小值,也许可以重构它。
-
您想要
time_t数据类型的最小/最大可表示 值还是最小/最大有效 值?例如,time_t可能是long,但任何小于 0 的值可能不对应于有效时间。 有效我的意思是可以从time()返回或与mktime()一起使用,等等。
标签: c c-preprocessor time-t