2017-09-30 21 views
2

Xcode- C programming - While loopに応答した後、私は理論上の回答を停止し、Windowsボックスにclangをインストールして、警告診断部門のgccよりも本当に良いかどうかを確認しました。なぜclang -Wempty-bodyはこのケースを検出しませんか?

私が間違っているこのコードをコンパイルするclang-Wempty-bodyを使用していますので:

  • 命令は長い時間がセミコロンで行を終了した後、セミコロン、可能なタイプミスで終わってしばらく...:無限ループ

    :テスト無用

間違ったコードを作る

  • if for文と同じこと、

    私はclang(5.0.0 x64のウィンドウ)でそれをコンパイルしようとした:

    出力:whileがない間ifが検出された

    S:\c>clang -Wempty-body test.c 
    test.c:8:10: warning: if statement has empty body [-Wempty-body] 
        if (c); 
         ^
    

    ので、空。

    今、私はwhile後のブロックでデクリメント命令をラップしています:

    int main(void) 
    { 
        char c=1; 
        while (c); 
        { --c; } 
        if (c); 
    } 
    

    今では適切に両方を検出するためのようだ:

    test.c:6:10: warning: if statement has empty body [-Wempty-body] 
        if (c); 
    test.c:4:13: warning: while loop has empty body [-Wempty-body] 
        while (c); 
    

    ノート:gccが見ることができませんでしたwhileのいずれかのバグであるため、clangはまだ警告検出に関して明らかに優れています(why am I not getting an "used uninitialized" warning from gcc in this trivial example?も参照)

    これの背後にあるヒューリスティックは何ですか?それはバグですか?

  • +0

    はバグではありません。一方、(C);が普通に使用されていて、Cがクリアされるのを待ちます。 –

    +1

    @ PeterJ_01ここで 'c'を再評価する必要はありません。ポインタを持たないローカル変数です。 –

    +0

    JFFあなたはclangが世話をしないエッジケースを見つけたかもしれません。 –

    答えて

    3

    あまりにも多くの誤検出を避けるためです。一般的にif (expr);は意味がありませんが、exprの副作用により、式が真から偽に切り替わる可能性があるため、while (expr);はエラーである必要はありません。例えば、

    void processAllElements() { 
        while (tryProcessNextElement()); 
    } 
    

    はここthe sourceがそれを説明する方法は次のとおりです。

    // `for(...);' and `while(...);' are popular idioms, so in order to keep 
    // noise level low, emit diagnostics only if for/while is followed by a 
    // CompoundStmt, e.g.: 
    // for (int i = 0; i < n; i++); 
    // { 
    //  a(i); 
    // } 
    // or if for/while is followed by a statement with more indentation 
    // than for/while itself: 
    // for (int i = 0; i < n; i++); 
    //  a(i); 
    
    +0

    正確に私が書いたものはコメントするかもしれません。 while();毎回警告するにはあまりにも一般的に使用されています。 –

    +0

    @ PeterJ_01あなたが書いたものとまったく同じではありません。実際に、私はAntti Haapalaがしたのと同じ理由であなたが書いたものに同意しません。 – hvd

    +0

    Cは任意のステートメントを意味します - 偶然に、この文字を変数名に使用しました。非常に狭いトンネルビジョン:) –

    関連する問題