2013-04-12 31 views
7

當我編譯下面的C程序時,出現以下警告: ‘noreturn’ function does return。這是功能:'noreturn'函數確實返回

void hello(void){ 
    int i; 
    i=1; 
} 

爲什麼會發生這種情況? 所有調用這個函數是hello();

編輯: 完整的錯誤輸出:

home.c: In function ‘hello’: 
hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable] 
home.c:840:1: error: ‘noreturn’ function does return [-Werror] 
cc1: all warnings being treated as errors 
make: *** [home.o] Error 1 
+0

你能發佈確切的編譯器警告嗎? –

+9

您能否創建一個[SSCCE](http://sscce.org/)並向我們展示一個完整的示例?還請包括_all_和_complete_錯誤/警告消息。 –

+2

你使用什麼編譯器?你使用了哪些編譯器選項? – Bechir

回答

24

它可以告訴gcc一個特定函數永遠不會返回。這允許進行某些優化,並有助於避免未初始化變量的虛假警告。

這是使用noreturn attribute完成:

void func() __attribute__ ((noreturn)); 

如果函數儘管noreturn屬性返回時,編譯器生成(在你的情況下,被轉換成一個錯誤),你所看到的警告。

既然你是不可能被使用在你的代碼noreturn,可能的解釋是,你有一個函數,它的名字的衝突與標準noreturn功能,如下面的例子:

#include <stdlib.h> 

void exit(int) { 
}    // warning: 'noreturn' function does return [enabled by default] 

這裏,我的exitexit(3)發生衝突。

這種衝突的另一個明顯候選人是abort(3)

當然,如果你的函數實際上被稱爲hello(),罪魁禍首幾乎可以肯定是你的代碼庫中的某個地方。

4

最有可能的是,該功能標有__attribute__((noreturn))。然而,它實際上返回(當控制到達irs主體的末端時,因爲它不進入無限循環,它不會調用其他「noreturn」功能等)。

我沒有看到你的觀點是什麼1.將函數標記爲不返回,2.編寫一個什麼都不做的函數 - 可能你可以消除這兩個函數?

+3

澄清這個答案:對於具有__attribute __((noreturn))的函數,如果函數體沒有以無限循環結束,或者調用另一個noreturn函數,則會得到此警告。換句話說,編譯器執行「流分析」並可以確定函數是否可能返回。請記住,在右大括號處有一個隱式返回。 – bootchk

+3

@bootchk,+1表示「無限循環」。 'f(){}'產生警告/錯誤。 'f(){while(1); ''沒問題。謝謝 – user3124812