include/linux/err.h中,有以下定义:

#define MAX_ERRNO       4095

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)

这个想法是要检查在指针位置返回的有效错误号,但是为什么在将MAX_ERRNO强制转换为无符号之前在其前面有一元-?看来这将导致x与最大长减MAX_ERRNO而不是4095进行比较。

最佳答案

看起来似乎是一种优化,仅使用一个比较来检查x是否在-4095-1之间,也就是有效的错误代码。对于signed long,您需要两个比较:
(x >= -4095 && x < 0)
将-4095强制转换为unsigned long会导致0xff...ff001,在到达ULONG_MAX之前,它的上方只有4094个整数。这些值也是地址空间末尾的无效指针地址(因此,为什么将此范围用于返回空指针的函数中的错误代码)。

因此,如果x >= 0xff...ff001,则条件将返回true,这对于-4095-1的有符号范围(有效错误代码范围)为true。

09-25 20:15