[clang] [clang][analyzer] fix false positive of BlockInCriticalSectionChecker (PR #127049)
Balazs Benics via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 13 07:57:10 PST 2025
================
@@ -315,16 +342,54 @@ bool BlockInCriticalSectionChecker::isBlockingInCritSection(
void BlockInCriticalSectionChecker::checkPostCall(const CallEvent &Call,
CheckerContext &C) const {
if (isBlockingInCritSection(Call, C)) {
+ // for 'read' and 'recv' call, check whether it's file descriptor(first
+ // argument) is
+ // created by 'open' API with O_NONBLOCK flag or is equal to -1, they will
+ // not cause block in these situations, don't report
+ StringRef FuncName = Call.getCalleeIdentifier()->getName();
+ if (FuncName == "read" || FuncName == "recv") {
+ const auto *Arg = Call.getArgExpr(0);
+ if (!Arg)
+ return;
+
+ SVal SV = C.getSVal(Arg);
+ if (const auto *IntValue = SV.getAsInteger()) {
+ if (*IntValue == -1)
+ return;
+ }
----------------
steakhal wrote:
Is this hunk relevant because we may have a perfectly constrained symbol for Arg, that itself is a symbol, but had a constraint for it that it must be equal to `-1`?
Is this scenario covered by tests?
https://github.com/llvm/llvm-project/pull/127049
More information about the cfe-commits
mailing list