在64位拱上投射指向整数问题警告的指针

Cor*_*son 4 c pointers kernel-module compiler-warnings linux-kernel

我正在编写一个使用导出符号的linux内核模块 open_exec

struct file *open_exec(const char *name)
Run Code Online (Sandbox Code Playgroud)

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

if (IS_ERR(file))
    return file;
Run Code Online (Sandbox Code Playgroud)

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

warning: return makes integer from pointer without a cast
Run Code Online (Sandbox Code Playgroud)

这是因为我的函数返回一个整数.如果我尝试施放它:

return (int) file;
Run Code Online (Sandbox Code Playgroud)

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

warning: cast from pointer to integer of different size
Run Code Online (Sandbox Code Playgroud)

这是因为sizeofint和指针在32位上是相同的,但它们在64位机器上是不同的.

无论是否投射,代码似乎都有效.我只是想摆脱警告.

如何正确地转换指向整数的指针并获得我期望的值,同时没有得到编译器警告?我期望的值本质include/asm-generic/errno-base.h上是linux内核代码库中列出的整数.

因为我只是看指针就好像它是一个整数,如果IS_ERR()是真的,我可以肯定它实际上只保留一个整数值.

Mic*_*urr 8

PTR_ERR()linux/err.h,这是在IS_ERR()也被定义,将一指针这真的错误代码转换成适当的类型(A long).

你应该使用类似的东西:

if (IS_ERR(file))
    return PTR_ERR(file);
Run Code Online (Sandbox Code Playgroud)

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

你的函数可能适合返回一个long而不是一个int- 但是所有的错误代码都应该代表一个int.

  • @Jim:说实话,我误解了最初的问题.如果没有在非错误情况下`file`指针发生的情况的上下文,很容易跳到在正常情况下指针作为`int`返回的结论.然后你会分心于问题的真实要求. (2认同)