【发布时间】:2011-07-26 05:27:33
【问题描述】:
我正在编写一个使用导出符号 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() 为真的情况下将指针视为一个整数,因此我可以确定它实际上只包含一个整数值。
【问题讨论】:
-
警告是有道理的:如果 int 不能保存指针,您的代码可能会出现问题;可能不会,但你不能确定;如果你的函数必须返回一个指针,你为什么使用 int 作为返回类型?
-
因为 95% 的我返回错误的情况我知道错误是什么,并指定它(即;返回 -EPERM;)。对于一个可能出错的函数,它返回一个指针,我想提取错误是什么,并报告它。
-
我无法得到它;在返回之前“提取”错误,将其映射到一个 int,然后返回该 int ......为什么不呢?或者,报告产生它的函数内部的错误;无论如何,不要混合使用整数和指针,即使在 32 位上也不好(你怎么能确定地址与 -EPERM 不匹配?)
-
查看源代码,使用 long 而不是 int 可以“解决”问题而不产生其他问题?
-
@Jim 好的,对不起,我的英语有点混淆了对概率的否定:)
标签: c pointers linux-kernel compiler-warnings kernel-module