2017-01-27 11 views
3

どちらの関数も適切な関数を返すのに2つの条件がある場合、アラームが発生します。すべてのケースをカバーしていても「制御は非空白関数の終了に達します」という警告が表示される

コントロールは非void型関数[-Wreturn型]

bool EtherTrafGen::isGenerator() 
{ 
    if (multipacket) return par("destAddresses").stringValue()[0]; 
    else if (!multipacket) return par("destAddress").stringValue()[0]; 
} 

、このような警告を修正する方法は何であるの終わりに達しましたか?

+2

'else if'の代わりに' else'を使うだけです。 2式が何らかの奇妙な方法で振る舞わない限り、実際には反対ではありません。その場合は、 'else'も提供してください(プロジェクトに新しい人には意味をなされるようにデザインを再考してください)。 – BoBTFish

+1

@BoBTFish実際、このケースでは、ifフローの条件が満たされていれば、制御フローが関数を終了するので、作者は 'else'を使う必要はありません。 – alexeykuzmin0

+1

' else if'を書く必要はないと思います。最初の行の 'if'が' true'なら 'else'を' false'と 'vice verca'とします –

答えて

3

制御が

bool EtherTrafGen::isGenerator() 
{ 
    if (multipacket) return par("destAddresses").stringValue()[0]; 
    else if (!multipacket) return par("destAddress").stringValue()[0]; 
    //here 
} 

に達することはありませんにもかかわらず、コンパイラが(それがelse ifだから)ということを知ることができず、それに達した場合、それは可能性未定義の動作に関する警告が表示さ(多分別のスレッドがmultipacketを変更最初のチェック後など)。あなただけのコンパイラを満足させるために、デフォルトの戻り値を追加することができます。

bool EtherTrafGen::isGenerator() 
{ 
    if (multipacket) return par("destAddresses").stringValue()[0]; 
    else if (!multipacket) return par("destAddress").stringValue()[0]; 
    return false; 
} 

それとも、それはtrueまたはfalseのどちらかだから、全体else ifをカット:

bool EtherTrafGen::isGenerator() 
{ 
    if (multipacket) return par("destAddresses").stringValue()[0]; 
    return par("destAddress").stringValue()[0]; // multipacket must be false here anyway 
} 
+2

ここで 'else'は冗長です。ただ返す – MRB

+0

@MRB良い観察。 –

+1

なぜここに到達できないのですか?私は2つのチェックの間にマルチパケットを変更する第2のスレッドを持っている...今何? – UKMonkey

1

あなたは1ケースに欠けている:

bool EtherTrafGen::isGenerator() 
{ 
    if (multipacket) return par("destAddresses").stringValue()[0]; 
    else { 
     if (!multipacket) return par("destAddress").stringValue()[0]; 
     else ???? <---- what should be done here 
    } 
} 
+0

OPのポイントを逃してしまいます: 'multipacket'は' true'または 'false'に評価される – Jarod42

+0

あなたは正しいですが、彼はなぜエラーが発生したかを尋ねました。ケースは扱われない – Aeonos

+0

コンパイラはすべてのケースが処理されたことを検出しません(一般的には検出が困難です)。 – Jarod42

1

私はあなたの状態を構造化した方法がかなりエキゾチックであると言って始めます。

if (multipacket) doX() 
else doY() 

コンパイラはこの問題を解決し、エラーを表示しないようにスマートにする必要があります。

しかし、あなたのコンパイラはそれほどスマートではありません。それは、それを持っているよりも、警告を持っていない方が良いとあなたが正しいと知っている。


上記のコードは間違っている可能性がある、より広く見ると、それはちょうど、コンパイラがその分析に十分に強力でない場合ではないのです。

マルチスレッドコンテキストで次のコードが発生すると、まれにスレッドの問題が発生する可能性があります。マルチスレッドへの最初のアクセスではfalseを読み取るため、2番目のブランチに移動し、2番目のアクセスでtrueしたがって、戻り値のない関数から外に出るように強制します。このケースは、別のスレッドがマルチパケットを読み取った2回の間に変更した場合に発生する可能性があります。

与えられたレジスタ/キャッシュ/その他の一時的な場所に値があるため、別のスレッドによってマルチパケットが変更されても、そのメソッドでは直ちに表示されないことがありますコンパイラによって。

しかし、なぜチャンスをつかむ書き込み非慣用的なコードはあなたの手に警告がありますか?

関連する問題