================
@@ -339,6 +425,36 @@ void 
BlockInCriticalSectionChecker::reportBlockInCritSection(
                                                     os.str(), ErrNode);
   R->addRange(Call.getSourceRange());
   R->markInteresting(Call.getReturnValue());
+  // for 'read' call, check whether it's file descriptor(first argument) is
+  // created by 'open' API with O_NONBLOCK flag and don't report for this
+  // situation.
+  if (Call.getCalleeIdentifier()->getName() == "read") {
+    do {
+      const auto *arg = Call.getArgExpr(0);
+      if (!arg)
+        break;
+
+      const auto *DRE = dyn_cast<DeclRefExpr>(arg->IgnoreImpCasts());
----------------
flovent wrote:

thank you for your detailed explanation, I did overlook some complex scenarios.

And I agree with your point, Checking for open's return value before calling 
`read` is very necessary in a real project, this is a modified testcase with 
checking for file descirptor,in that case we can ignore concrete integers 
situation.
```
void foo()
{
    std::lock_guard<std::mutex> lock(mtx);

    const char *filename = "example.txt";
    int fd = open(filename, O_RDONLY | O_NONBLOCK);

    char buffer[200] = {};
    if (fd == -1)
      return;
    read(fd, buffer, 199); // no-warning: fd is a non-block file descriptor
    close(fd);
}
```

https://github.com/llvm/llvm-project/pull/126752
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to