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?も参照)
これの背後にあるヒューリスティックは何ですか?それはバグですか?
はバグではありません。一方、(C);が普通に使用されていて、Cがクリアされるのを待ちます。 –
@ PeterJ_01ここで 'c'を再評価する必要はありません。ポインタを持たないローカル変数です。 –
JFFあなたはclangが世話をしないエッジケースを見つけたかもしれません。 –