【问题标题】:Why does IS_ERR_VALUE cast negative MAX_ERRNO to an unsigned long?为什么 IS_ERR_VALUE 将负 MAX_ERRNO 转换为无符号长整数?
【发布时间】:2016-07-17 16:57:51
【问题描述】:

include/linux/err.h中定义如下:

#define MAX_ERRNO       4095

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

这个想法是检查返回的有效错误号代替指针,但为什么 MAX_ERRNO 在被强制转换为无符号之前在它前面有一个一元 -?看起来这会导致 x 与最大 long 减去 MAX_ERRNO 而不是 4095 进行比较。

【问题讨论】:

  • 因为地址为 0x0000 .. 0x0fff 的指针是有效的(好吧,前 16 个,IIRC,地址用于表示 NULL PTR)。但是上面的空间专用于无效[从未使用]指针。注意:我们谈论的是虚拟地址。

标签: c linux-kernel error-code


【解决方案1】:

仅使用 一个 比较来检查 x 是否在 -4095-1 之间(也就是有效的错误代码)似乎是一种优化。对于signed long,您需要进行两次比较:

(x >= -4095 && x < 0)

将 -4095 转换为 unsigned long 会得到 0xff...ff001,在达到 ULONG_MAX 之前,它上面只有 4094 个整数。这些值也是地址空间末尾的无效指针地址(因此该范围用于返回 void 指针的函数中的错误代码)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多