gribozavr added inline comments.

================
Comment at: docs/clang-tidy/checks/bugprone-infinite-loop.rst:12
+the loop condition is not changed. This check detects such loops. A loop is
+considered as infinite if it does not have any loop exit statement (``break``,
+``continue``, ``goto``, ``return``, ``throw`` or a call to a function called as
----------------
s/as//


================
Comment at: test/clang-tidy/bugprone-infinite-loop.cpp:156
+  }
+  int &ii = i;
+}
----------------
baloghadamsoftware wrote:
> gribozavr wrote:
> > Is all escaping that syntactically follows the loop actually irrelevant? 
> > For example:
> > 
> > ```
> > int i = 0;
> > int j = 0;
> > int *p = &j;
> > for (int k = 0; k < 5; k++) {
> >   *p = 100;
> >   if (k != 0) {
> >     // This loop would be reported as infinite.
> >     while (i < 10) {
> >     }
> >   }
> >   p = &i;
> > }
> > ```
> You are right, but how frequent are such cases? I found no false positives at 
> all when checking some ope-source projects. Should we spend resources to 
> detect escaping in a nesting loop? I could not find a cheap way yet. I 
> suppose this can only be done when nesting two loops. (I am sure we can 
> ignore the cases where the outer loop is implemented using a `goto`.
I don't know, however, this is one of the few sources of false positives for 
this check. This check generally can't detect all infinite loops, it is only 
trying to detect obvious ones. Therefore, I don't think it is exchange a bit 
more precision for false positives.

My best advice is to drop the heuristic about variable escaping after the loop. 
Any escaping => silence the warning.

If you want to handle this case correctly, you have to use the CFG.


================
Comment at: test/clang-tidy/bugprone-infinite-loop.cpp:225
+  while (1)
+    ; //FIXME: We expect report in this case.
+}
----------------
baloghadamsoftware wrote:
> gribozavr wrote:
> > Why?
> > 
> > Intentional infinite loops *that perform side-effects in their body* are 
> > quite common -- for example, network servers, command-line interpreters etc.
> > 
> > Also, if the loop body calls an arbitrary function, we don't know if it 
> > will throw, or `exit()`, or kill the current thread or whatnot.
> We already handle loop exit statements including calls to `[[noreturn]]` 
> functions. Is that not enough?
User-defined functions are not always annotated with ``[[noreturn]]``, and 
sometimes can't be annotated, for example, because they call `exit()` 
conditionally:

```
while (true) {
  std::string command = readCommand();
  executeCommand(command);
}

void executeCommand(const std::string &command) {
  if (command == "exit") {
    exit();
  }
  ...
}
```


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D64736/new/

https://reviews.llvm.org/D64736



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to