2013-04-12 30 views
7

以下のCプログラムをコンパイルすると、この警告が表示されます。 ‘noreturn’ function does returnこれは関数です:'noreturn'関数が返す

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

なぜそれが起こっている可能性がありますか? フルエラー出力:

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を伝えることが可能である。この関数へ すべての呼び出しはhello();

EDITです。これにより、特定の最適化が可能になり、初期化されていない変数の偽の警告が回避されます。これはnoreturn attributeを使用して行われ

:関数が返さない場合noreturn属性にもかかわらず、

void func() __attribute__ ((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))を持つ関数の場合、関数本体が無限ループで終了していないか、別の関数が呼び出されていない場合、この警告が表示されます。言い換えれば、コンパイラは「フロー解析」を行い、関数が実際に復帰するかどうかを判断できます。閉じ括弧に暗黙の復帰があることを忘れないでください。 – bootchk

+3

@bootchk、 "無限ループ" +1。 'f(){}'は警告/エラーを生成します。 'f(){while(1); } '大丈夫です。ありがとう – user3124812