[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 Patrick Palka changed: What|Removed |Added Status|NEW |RESOLVED CC||ppalka at gcc dot gnu.org Resolution|--- |FIXED Target Milestone|--- |6.0 --- Comment #8 from Patrick Palka --- Good news, with GCC 6's new -Wmisleading-indentation flag we emit the appropriate warning for the test case in comment #1: 62184.C: In function ‘int foo()’: 62184.C:5:3: warning: this ‘while’ clause does not guard... [-Wmisleading-indentation] while (bar()); ^ 62184.C:6:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘while’ sleep(); ^ As for the test case in comment #6: int main() { for (; 1<2; ); if (1==1); while (1==1); return 0; } We don't and arguably shouldn't warn, because none of the statements are indented as if they're intended to be guarded by a previous one. However, we do warn (twice) for int main() { for (; 1<2; ); if (1==1); while (1==1); return 0; } So I think this PR can finally be closed.
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 Manuel López-Ibáñez changed: What|Removed |Added Last reconfirmed|2014-11-12 00:00:00 |2016-3-3 --- Comment #7 from Manuel López-Ibáñez --- (In reply to imitrichev from comment #6) > I think, while patching one should consider also warn on `for` loop empty > body. Sure, but it is always better to submit a sequence of smaller patches than one large one. Once you get the details right for while() it should be easy to implement for(). > It is really would be helpful to detect infinite loops caused by odd ';' > after `for` and `while` without debugger. It just needs someone to implement it. GCC devs are already very busy with other things. We need as much help as we can get.
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 imitrichev changed: What|Removed |Added CC||imitrichev at muctr dot ru --- Comment #6 from imitrichev --- I think, while patching one should consider also warn on `for` loop empty body. Whilst we can write something like int i=0; for (; i<5; a[i]=10, i++); it is assumed to be not a great programming style. int main() { for (; 1<2; ); if (1==1); while (1==1); return 0; } Now it warns only on `if` loop: g++ empty.cpp -Wempty-body -o empty.out empty.cpp: In function "int main()": empty.cpp:4:10: warning: suggest braces around empty body in an «if» statement [-Wempty-body] It is really would be helpful to detect infinite loops caused by odd ';' after `for` and `while` without debugger.
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 Manuel López-Ibáñez changed: What|Removed |Added Keywords||easyhack Severity|normal |enhancement --- Comment #5 from Manuel López-Ibáñez --- If we can warn precisely about misleading indentation, surely we can warn here as well as clang does.
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 Manuel López-Ibáñez manu at gcc dot gnu.org changed: What|Removed |Added Status|UNCONFIRMED |NEW Last reconfirmed||2014-11-12 Ever confirmed|0 |1 --- Comment #4 from Manuel López-Ibáñez manu at gcc dot gnu.org --- I'm going to confirm this. We definitely want this. The heuristic of Clang seems quite elaborated: only warn when the ';' is on the same line and there is a statement after it that starts at a higher column than the while.line. void foo () { #define EMPTY while (0)EMPTY; foo(); // warns if preprocessed while (0); foo(); // warns while (0); foo(); // does not warn while (0); // does not warn } $ clang test.c test.c:6:12: warning: while loop has empty body [-Wempty-body] while (0); ^ test.c:6:12: note: put the semicolon on a separate line to silence this warning $ clang test.c -save-temps In file included from test.c:1: test.c:4:12: warning: while loop has empty body [-Wempty-body] while (0); ^ test.c:4:12: note: put the semicolon on a separate line to silence this warning test.c:6:12: warning: while loop has empty body [-Wempty-body] while (0); ^ test.c:6:12: note: put the semicolon on a separate line to silence this warning
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 --- Comment #3 from Tobias Burnus burnus at gcc dot gnu.org --- (In reply to Manuel López-Ibáñez from comment #2) We had this and it got removed (see PR36478). Perhaps a better implementation is possible now that we track macro locations. There one had: warn2.cc:6: error: suggest a space before ‘;’ or explicit braces around empty While CLANG requires a new line (according to the message), such that #define EMPTY while() EMPTY; would be fine while while(f()) ; // or: while(f())EMPTY; wouldn't. (Given how stray spaces enter the code, I'd also like the while(f()) ; warning.) (I wonder how the Clang guys get away with warning about all this stuff by default. Is it because they have very good heuristics to avoid being annoying?) Me too, although I have a log file here with clang -Weverything for our code, from which I extract all warning classes (164M) - and look at the individual warnings for those looking potentially interesting. [BTW: One should also consider adding -Weverything to GCC, which helps to find discover warning options.]
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 Manuel López-Ibáñez manu at gcc dot gnu.org changed: What|Removed |Added CC||manu at gcc dot gnu.org --- Comment #2 from Manuel López-Ibáñez manu at gcc dot gnu.org --- We had this and it got removed (see PR36478). Perhaps a better implementation is possible now that we track macro locations. (I wonder how the Clang guys get away with warning about all this stuff by default. Is it because they have very good heuristics to avoid being annoying?)
[Bug c/62184] [C/C++] Extend -Wempty-body to 'while' loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62184 Tobias Burnus burnus at gcc dot gnu.org changed: What|Removed |Added Keywords||diagnostic CC||mpolacek at gcc dot gnu.org Summary|[C/C++] Extend -Wempty-body |[C/C++] Extend -Wempty-body |to |to 'while' loops --- Comment #1 from Tobias Burnus burnus at gcc dot gnu.org --- For an empty if loop, GCC warns with -Wextra: foo.cc:5:13: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] if (bar()); ^ However, using a while loop, it doesn't. Clang warns (by default) in that case: foo.cc:5:16: warning: while loop has empty body [-Wempty-body] while (bar()); ^ foo.cc:5:16: note: put the semicolon on a separate line to silence this warning Again, I found that issue in a real-world code. Test case: int bar (); void sleep(); int foo() { while (bar()); sleep(); return 1; }