内核中的整数溢出 - 可能吗?

时间:2017-03-29 18:46:54

标签: linux linux-kernel integer-arithmetic

我必须在内核中进行整数运算,特别是我需要通过某个增量来增加size_t个对象,这种情况会经常发生。所以我想知道我是否需要防范内核中可能存在的整数溢出,如果是这样,内核是否会为此提供宏或API?

2 个答案:

答案 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_beforetime_before64)。< / p>

但是有一些通用宏用于进行溢出检查的数学运算吗?随便梳理内核树(3.18.31,我方便),它看起来不那样。 grep -i overflow子树上的include未提供任何内容,而fs等代码区域中的类似搜索会显示使用 ad hoc 本地编码的溢出检查。真是太遗憾了;你认为“如果我将这两个int值加在一起就会出现问题”这个问题很普遍,以至于会有一个解决方案,每个人都可以像某些addv(x_int, y_int, &overflow_flag)一样使用不管。