我在寫一個Linux內核模塊,它利用了輸出符號open_exec
鑄造指針在64位拱警告
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作爲返回類型? – ShinTakezou
,因爲在那裏我返回一個錯誤的案件95%,我知道是什麼錯誤,並將其指定(即,返回-EPERM)。對於可能出錯的函數,返回一個指針,我想提取錯誤是什麼,並報告。 –
我無法得到它;在返回之前「提取」錯誤,將其映射到一個int,並返回該int ...爲什麼不呢?或者,在產生它的func內報告錯誤;反正,不要混用整數和指針,即使是在32位不好(你怎麼能肯定的地址不偶然匹配-EPERM?) – ShinTakezou