在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进行比较。
答案 0 :(得分:2)
仅使用一个比较来查看x
是否在-4095
和-1
之间,也就是有效的错误代码,这看起来像是一种优化。对于signed long
,您需要进行两次比较:
(x >= -4095 && x < 0)
将-4095投放到unsigned long
会产生0xff...ff001
,在达到ULONG_MAX
之前只有4094个整数。这些值也是地址空间末尾的无效指针地址(因此,此范围用于返回void指针的函数中的错误代码)。
因此,如果x >= 0xff...ff001
,条件将返回true,对于-4095
到-1
的有符号范围(有效的错误代码范围),该条件为真。