[clang] [clang][ThreadSafety] Handle mutex scope (PR #157171)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 5 13:37:25 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-analysis
Author: Prabhu Rajasekaran (Prabhuk)
<details>
<summary>Changes</summary>
Before emitting warning about locks being held at the end of function
scope check if the underlying mutex is function scoped or not.
---
Full diff: https://github.com/llvm/llvm-project/pull/157171.diff
1 Files Affected:
- (modified) clang/lib/Analysis/ThreadSafety.cpp (+16)
``````````diff
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp
index 131170df9976e..b215a6e6d74cc 100644
--- a/clang/lib/Analysis/ThreadSafety.cpp
+++ b/clang/lib/Analysis/ThreadSafety.cpp
@@ -2443,6 +2443,22 @@ void ThreadSafetyAnalyzer::intersectAndWarn(FactSet &EntrySet,
if (join(FactMan[*EntryIt], ExitFact, JoinLoc, EntryLEK))
*EntryIt = Fact;
} else if (!ExitFact.managed() || EntryLEK == LEK_LockedAtEndOfFunction) {
+ if (EntryLEK == LEK_LockedAtEndOfFunction) {
+ const til::SExpr *Sexp = ExitFact.sexpr();
+ const VarDecl *Var = nullptr;
+
+ if (const auto *Proj = dyn_cast<til::Project>(Sexp)) {
+ if (const auto *Base = dyn_cast<til::LiteralPtr>(Proj->record()))
+ Var = dyn_cast_or_null<VarDecl>(Base->clangDecl());
+ } else if (const auto *LP = dyn_cast<til::LiteralPtr>(Sexp)) {
+ Var = dyn_cast_or_null<VarDecl>(LP->clangDecl());
+ }
+
+ if (Var && Var->getStorageDuration() == SD_Automatic &&
+ Var->getDeclContext() == CurrentFunction) {
+ continue;
+ }
+ }
ExitFact.handleRemovalFromIntersection(ExitSet, FactMan, JoinLoc,
EntryLEK, Handler);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/157171
More information about the cfe-commits
mailing list