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()是真的,我可以肯定它实际上只保留一个整数值.
的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.