内核整数溢出 – 可能吗?

我必须在内核做整数算术,特别是我需要增加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_beforetime_before64 )。

但有没有一些一般的宏与溢出检查做数学? 随便梳理一个内核树(3.18.31,在我方便的时候),它不会出现这种情况。 includegrep -i overflow没有提供任何东西,类似于fs这样的代码区域的搜索揭示了使用ad hoc本地编码的溢出检查。 真是太可惜了, 你会认为“如果我把这两个int值加在一起,是否存在问题”的问题已经足够普遍了,以至于每个人都可以使用像addv(x_int, y_int, &overflow_flag)类的解决方案。

内核整数溢出 – 可能吗?

是。 无所谓,用户空间或内核 – 这只是CPU的工作原理。

我想知道是否需要防止内核中可能的整数溢出

如果你认为这可能发生,你的情况是不可接受的 – 那么是的。 对于有符号整数,它甚至可能导致未定义的行为 。

内核是否为此提供了宏或者API

不,在内核中没有用于处理整数溢出的准备使用的函数。 那么,有一些GCC包装溢出检测…但一定不要使用它。 否则,Linus Torvalds会来这里 ,像在这里一样:)

无论如何,当你真的需要手动检测整数溢出时,很容易。 看这里例如。 在你的情况下, size_t是无符号的,所以你只需要确保它不包装处理包装的值: 细节 。