在 64 位 arch 上转换一个指向整数的问题警告

标签 c pointers linux-kernel compiler-warnings kernel-module

我正在编写一个使用导出符号 open_exec

的 linux 内核模块
struct file *open_exec(const char *name)

它返回一个指针,我可以使用 IS_ERR 宏检查错误:

if (IS_ERR(file))
    return file;

在编译期间,我收到此警告:

warning: return makes integer from pointer without a cast

这是因为我的函数在这里返回一个整数。如果我尝试转换它:

return (int) file;

我在 32 位机器上没有收到警告,但在 64 位机器上收到警告:

warning: cast from pointer to integer of different size

这是因为 int 和指针的 sizeof 在 32 位机器上相同,但在 64 位机器上不同。

不管是否强制转换,代码似乎都有效。我只想去掉警告。

我如何正确地将指针转换为整数并获得我期望的值,同时不会收到编译器警告?我期望的值本质上是一个整数,列在 linux 内核代码库的 include/asm-generic/errno-base.h 中。

因为在 IS_ERR() 为 true 的情况下,我只将指针视为一个整数,所以我可以确定它实际上只包含一个整数值.

最佳答案

linux/err.h 中的 PTR_ERR() 宏也定义了 IS_ERR(),它将一个指针转换为实际上是将错误代码转换为适当的类型(long)。

你应该使用类似的东西:

if (IS_ERR(file))
    return PTR_ERR(file);

在源代码中搜索 PTR_ERR() 的现有用法,您会发现这是一种常见模式。

您的函数返回 long 而不是 int 可能更合适 - 但所有错误代码都应该可以用 int 表示.

关于在 64 位 arch 上转换一个指向整数的问题警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6825640/

相关文章:

c - 线程的缓存在退出时是否刷新到主内存?

c - 内部静态数组(K&R month_name() 函数)

c - 指针和取消引用

c++11 - C++ gettid() 未在此范围内声明

linux -/proc/[pid]/io 中的计数器是什么意思?

c - #C,输入总工资并得到净收入的程序

c - 我怎么知道我的程序在哪一步(预处理器、编译、链接)编译失败?

使用 C 中固定的行数创建二维数组

c - 为什么指针和数组不一样: Need justification on quote

android - 在 Android 中,我可以在没有用户提示的情况下以编程方式将我的应用程序添加到 superuser.apk 列表吗?