为什么 IS_ERR_VALUE 将负值 MAX_ERRNO 转换为 unsigned long?
Why does IS_ERR_VALUE cast negative MAX_ERRNO to an unsigned long?
在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 个整数。这些值也是地址末尾的无效指针地址 space(因此这个范围用于 return 无效指针的函数中的错误代码)。
因此,如果 x >= 0xff...ff001
,条件将 return 为真,这对于 -4095
到 -1
的带符号范围(有效错误代码范围)为真。
在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 个整数。这些值也是地址末尾的无效指针地址 space(因此这个范围用于 return 无效指针的函数中的错误代码)。
因此,如果 x >= 0xff...ff001
,条件将 return 为真,这对于 -4095
到 -1
的带符号范围(有效错误代码范围)为真。