我必须在内核中进行整数运算,特别是我需要通过某个增量来增加size_t
个对象,这种情况会经常发生。所以我想知道我是否需要防范内核中可能存在的整数溢出,如果是这样,内核是否会为此提供宏或API?
答案 0 :(得分:1)
内核中的整数溢出 - 可能吗?
是。无关紧要,用户空间或内核 - 它只是CPU的工作方式。
我想知道是否需要防范内核中可能的整数溢出
如果你认为它可以发生和,那么你的情况是不可接受的 - 那么是的。对于有符号整数,它甚至可以导致undefined behavior。
内核是否为此
提供了宏或API
不,内核中没有用于处理整数溢出的现成函数。好吧,有一些GCC wrappers用于溢出检测......但一定不要使用它。否则Linus Torvalds会来对你大喊大叫,如here:)
无论如何,当你真的需要时,很容易手动检测整数溢出。以here为例。在您的情况下,size_t
是未签名的,因此您只需要确保它不会包装或处理包装的值:details。
答案 1 :(得分:1)
size_t
不会溢出;它是一个无符号类型,具有明确定义的“环绕”语义。增加size_t
的最高值会导致
零。
在size_t
的特定情况下,在size_t
的简单操作中,就像将两个大小一起添加一样,通常只需检查结果操作数是否大于两个源操作数之一。如果(size3 = size1 + size2) < size1)
,你有一个包装。
如果使用无符号类型作为绕“轮”运行的时钟值,则可以使用宏来正确地进行“时间之前”计算。例如,我们希望将时间0xFFFFFFFE
视为过去w.r.t中的几个时间单位。时间0x00000003
。如果您在内核中使用“jiffies”时间,那么您可以使用time_before
内联函数以及该系列中的其他函数。 (请注意,“经典jiffies”(我的术语)表示为long
,64位jiffies表示为u64
,具有单独的函数,如time_before
与time_before64
)。< / p>
但是有一些通用宏用于进行溢出检查的数学运算吗?随便梳理内核树(3.18.31,我方便),它看起来不那样。 grep -i overflow
子树上的include
未提供任何内容,而fs
等代码区域中的类似搜索会显示使用 ad hoc 本地编码的溢出检查。真是太遗憾了;你认为“如果我将这两个int
值加在一起就会出现问题”这个问题很普遍,以至于会有一个解决方案,每个人都可以像某些addv(x_int, y_int, &overflow_flag)
一样使用不管。