我必须在内核做整数算术,特别是我需要增加size_t
对象的一些增量,这将经常发生。 所以我想知道是否需要防止内核中可能的整数溢出,如果是的话,内核是否提供了macros或API?
size_t
不溢出; 它是一个无符号类型,具有定义良好的“环绕”语义。 增加size_t
的最高值会导致零。
在size_t
的具体情况下,在size_t
的简单操作中,如同时添加两个大小,通常只需检查结果操作数是否大于两个源操作数中的一个。 如果(size3 = size1 + size2) < size1)
,你有一个换行。
如果使用无符号类型作为围绕“轮子”的时钟值,则有正确执行“时间前”计算的宏。 例如,我们希望0xFFFFFFFE
在过去的时间0x00000003
被视为几个时间单位。 如果您在内核中使用“jiffies”时间,则可以使用time_before
内联函数以及该系列中的其他函数。 (请注意,有“经典jiffies”(我的词)表示为long
64位jiffies表示为u64
,具有不同的功能,如time_before
与time_before64
)。
但有没有一些一般的宏与溢出检查做数学? 随便梳理一个内核树(3.18.31,在我方便的时候),它不会出现这种情况。 include
子grep -i overflow
没有提供任何东西,类似于fs
这样的代码区域的搜索揭示了使用ad hoc本地编码的溢出检查。 真是太可惜了, 你会认为“如果我把这两个int
值加在一起,是否存在问题”的问题已经足够普遍了,以至于每个人都可以使用像addv(x_int, y_int, &overflow_flag)
类的解决方案。
内核整数溢出 – 可能吗?
是。 无所谓,用户空间或内核 – 这只是CPU的工作原理。
我想知道是否需要防止内核中可能的整数溢出
如果你认为这可能发生,你的情况是不可接受的 – 那么是的。 对于有符号整数,它甚至可能导致未定义的行为 。
内核是否为此提供了宏或者API
不,在内核中没有用于处理整数溢出的准备使用的函数。 那么,有一些GCC包装溢出检测…但一定不要使用它。 否则,Linus Torvalds会来这里 ,像在这里一样:)
无论如何,当你真的需要手动检测整数溢出时,很容易。 看这里例如。 在你的情况下, size_t
是无符号的,所以你只需要确保它不包装或处理包装的值: 细节 。