Linux 中的 IS_ERR() 宏

作者:编程家 分类: linux 时间:2025-06-08

Linux中的IS_ERR()宏:判断指针是否为错误指针

在Linux内核开发中,经常会遇到需要判断指针是否为错误指针的情况。为了方便开发人员进行指针判断,Linux提供了一个宏定义IS_ERR(),可以用来判断指针是否为错误指针。本文将介绍IS_ERR()宏的用法,并通过案例代码来演示。

IS_ERR()宏的用法

IS_ERR()宏的定义位于Linux内核的头文件中,其定义如下:

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

#define IS_ERR_PTR(x) ((unsigned long)(void *)(x) > (unsigned long)-MAX_ERRNO)

#define IS_ERR(x) unlikely(IS_ERR_VALUE((unsigned long)(x)) || IS_ERR_PTR(x))

IS_ERR()宏接受一个指针作为参数,返回一个布尔值,用于判断指针是否为错误指针。宏的实现主要分为三个部分,分别是IS_ERR_VALUE()、IS_ERR_PTR()和IS_ERR()。

IS_ERR_VALUE()宏用于判断指针是否为错误值,它使用了unlikely()宏来判断表达式的概率是否为真。如果指针的值大于等于(unsigned long)-MAX_ERRNO,即大于等于错误值的上界,那么IS_ERR_VALUE()宏返回真,否则返回假。

IS_ERR_PTR()宏用于判断指针是否为错误指针,它将指针先转换为unsigned long类型,然后与(unsigned long)-MAX_ERRNO进行比较。如果指针的值大于(unsigned long)-MAX_ERRNO,即大于错误指针的下界,那么IS_ERR_PTR()宏返回真,否则返回假。

IS_ERR()宏通过调用IS_ERR_VALUE()和IS_ERR_PTR()来判断指针是否为错误指针。如果指针既满足IS_ERR_VALUE()的条件,又满足IS_ERR_PTR()的条件,那么IS_ERR()宏返回真,否则返回假。

案例代码

下面通过一个简单的案例代码来演示IS_ERR()宏的使用:

c

#include

int main() {

int *ptr = NULL;

ptr = (int *)-EINVAL; // 错误指针

if (IS_ERR(ptr)) {

printk("ptr is an error pointer.\n");

} else {

printk("ptr is not an error pointer.\n");

}

return 0;

}

在上面的代码中,我们将一个错误值-EINVAL强制类型转换为int类型指针ptr。然后使用IS_ERR()宏来判断ptr是否为错误指针。如果ptr是一个错误指针,那么将打印"ptr is an error pointer.";否则将打印"ptr is not an error pointer."。

IS_ERR()宏是Linux内核中用于判断指针是否为错误指针的宏定义。通过判断指针的值是否在错误值的范围内,IS_ERR()宏可以准确地判断指针是否为错误指针。在Linux内核开发中,我们经常会用到IS_ERR()宏来进行指针判断,以便正确处理错误情况。