2016-07-27 3 views
1

を返すべきではありません「noreturn」を宣言し、我々はnoreturn属性の異なる内部名を持っています。それは私が)私はエラー:関数は、私の職場で

INTERNAL_DONT_RETURN void foo() const 
{ 
    if(!*this) 
    { 
     throw CoolException(); 
    } 
    m_call_throw(); 
} 

このm_call_throw(のような何かをクラスのメンバ関数を書いていますINTERNAL_DONT_RETURN

であると仮定すると、ラムダとしてクラスのコンストラクタに移入ますプライベートクラスメンバーstd::function<void()>m_call_throwです。このラムダ今すぐ両方

m_call_throw([uncoolID]() { throw UncoolException(uncoolID); })

が、何もしない、GCC-4.9.3と打ち鳴らすには、私がすでにthisthis疑問を相談している

error: function declared 'noreturn' should not return [-Werror,-Winvalid-noreturn] } ^

次の警告を与えるが、それらのどれも説明していません上記の警告の原因。 hereを説明するように

1)は、コンパイラが暗黙的にreturnを追加していますか?コンパイラは私の関数が返されることを信じない理由私は例外をスローしていたとしても

2)?

The noreturn keyword does not affect the exceptional path when that applies: a noreturn-marked function may still return to the caller by throwing an exception or calling longjmp.

は私の問題には、この関連性があることに言及noreturn attribute

3)?

+0

[MCVE] –

答えて

6

あなたは戻ってきます! if文が偽であれば、関数の終わりから落ちます。 m_call_throw()が決して戻ってこないので、これは決して起こり得ないことを知っているかもしれませんが、コンパイラは明らかにこのロジックを理解しません。

はnoreturnとしてマークm_call_throw()ですか?そうでない場合は、追加します。そしてコンパイラがそれを拾わないならば、決して届かないが、警告を消すはずの関数の最後にスローを追加することができます。

0

あなたのfooが返品、または少なくともを返すようだからです。

機能がnoreturnで宣言された場合には、その機能が戻らない必要があります。

void Foo() __attribute__((noreturn)); 

void Foo() 
{ 
    // The application will exit, without returning. 
    exit(0); 
} 

int main() 
{ 
    Foo(); 
} 

あなたのm_call_throwはどちらか返さないことを知っているが、コンパイラにはありません。

ので、明示的に次のようにそれが役立つかもしれないことをコンパイラに伝える:

void Foo() __attribute__((noreturn)); 
void m_call_throw() __attribute__((noreturn)); 

void Foo() 
{ 
    // Ok, no return huh? 
    m_call_throw(); 
} 

ライブデモがhereです。

1

コンパイラは、関数が常にスローされますことを証明することはできません。これはバグではありません。コンパイラーがいずれの方法でも証明できない場合もあります。それは興味深い質問ですあなたに警告すべきか否か

。警告すると、そこにはないバグが報告されることがあります。本当のバグを見逃してしまうことを警告していない。

警告を簡単に致命的にすることや、さまざまな方法で消音することが簡単にできます。この特定のファイルに対して無効にするか、末尾にabortへの呼び出しを追加してください。それぞれのケースでトレードオフがありますが、それは人生です。

ラムダ/スタンダード::機能から通常のメンバー機能に切り替えることができる場合は、それを実行してnoreturnとします。ああ、noreturnファンクションタイプ、またはnoreturnstd::functionまたはnoreturnラムダを持つことはできません。これはIMHOのバグです。

+0

+1を入力してください。私には、まだ未知関数の型、または未知数のstd ::関数または未知数のラムダ – Recker

関連する問題