【发布时间】:2017-06-01 09:42:34
【问题描述】:
bcache 源 here 包含以下行:
schedule_delayed_work(&dc->writeback_rate_update,
dc->writeback_rate_update_seconds * HZ);
writeback_rate_update_seconds 定义为 unsigned int,在 x86_64 上是 appears to be 32 bit,我不确定 HZ 有什么类型,但我相信值是 1000,并假设它是 32 位或更少。
如果我将writeback_rate_update_seconds 设置为2147483647,那么实际上将什么值传递给schedule_delayed_work? schedule_delayed_work 的第二个参数似乎是 long,但这并不意味着操作数在乘法溢出之前被提升为 long,对吗?
【问题讨论】:
-
不,直到乘法完成后才会提升值,它使用原始参数的类型。
-
因为它是
unsigned,所以溢出会使用模运算来回绕。 -
@Barmar 原谅我的无知,但是“使用模运算环绕”到底是什么意思?这是否意味着乘法就像
long一样完成,但只返回最低有效的 32 位? -
我如何找到 HZ 的类型,如果这很重要?
-
在维基百科中查找模运算。
HZ大概是个宏,看一下宏定义应该就知道是什么类型了。
标签: c integer-overflow