在 Linux 内核中,函数指针的判断为空时,一般使用 `IS_ERR_OR_NULL()` 宏来进行判断,而不是直接使用 `== NULL` 运算符。这是因为 Linux 内核中的函数指针可能会使用一些特殊的值来表示错误或特殊情况。\n\n`IS_ERR_OR_NULL()` 宏用于判断函数指针是否为错误或空指针。如果函数指针为 `NULL` 或者函数指针的值在错误码范围内(负数),则返回真;否则返回假。\n\n下面是一个示例代码,演示了如何在 Linux 内核中使用 `IS_ERR_OR_NULL()` 宏来判断函数指针是否为空:\n\nc\n#include <linux/kernel.h>\n#include <linux/module.h>\n\nstatic int (*my_func)(void); // 声明一个函数指针\n\nstatic int my_function(void)\n{\n printk(KERN_INFO "Hello from my_function!\n");\n return 0;\n}\n\nstatic int __init my_module_init(void)\n{\n if (IS_ERR_OR_NULL(my_func)) {\n printk(KERN_INFO "my_func is NULL or an error pointer\n");\n return -1;\n }\n\n my_func = my_function; // 将函数指针指向 my_function\n\n if (IS_ERR_OR_NULL(my_func)) {\n printk(KERN_INFO "my_func is NULL or an error pointer\n");\n return -1;\n }\n\n // 调用函数指针\n my_func();\n\n return 0;\n}\n\nstatic void __exit my_module_exit(void)\n{\n if (!IS_ERR_OR_NULL(my_func)) {\n // 清空函数指针\n my_func = NULL;\n }\n}\n\nmodule_init(my_module_init);\nmodule_exit(my_module_exit);\n\nMODULE_LICENSE("GPL");\nMODULE_AUTHOR("Your Name");\nMODULE_DESCRIPTION("A sample kernel module");\n\n\n在上面的示例代码中,首先声明了一个函数指针 `my_func`,然后在模块初始化函数中使用 `IS_ERR_OR_NULL()` 宏来判断函数指针是否为空。如果函数指针为空,则打印一条消息并返回错误。\n\n接着,将函数指针指向 `my_function` 函数,并再次使用 `IS_ERR_OR_NULL()` 宏进行判断。如果函数指针仍然为空,则打印一条消息并返回错误。\n\n最后,在模块退出函数中,通过将函数指针设置为 `NULL` 来清空函数指针。\n\n请注意,这只是一个示例代码,实际使用时需要根据具体情况进行修改和适配。

Linux 内核扩展编译:安全判断函数指针为空 - IS_ERR_OR_NULL() 宏详解

原文地址: http://www.cveoy.top/t/topic/pVXL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录