diff options
author | Marco Elver <elver@google.com> | 2025-05-26 17:03:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-26 17:03:55 +0200 |
commit | c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9 (patch) | |
tree | 79aef42f5a494cc7350c07d46c170a92b685668b /clang/lib/Sema/AnalysisBasedWarnings.cpp | |
parent | 365dcf48b8aa726fb6a9ace4b37eb1f1cf121941 (diff) | |
download | llvm-c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9.zip llvm-c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9.tar.gz llvm-c7ccfc6dfc1c2d0ca9cf5615f9f95bb7ad78b1c9.tar.bz2 |
Thread Safety Analysis: Support reentrant capabilities (#137133)
Introduce the `reentrant_capability` attribute, which may be specified
alongside the `capability(..)` attribute to denote that the defined
capability type is reentrant. Marking a capability as reentrant means
that acquiring the same capability multiple times is safe, and does not
produce warnings on attempted re-acquisition.
The most significant changes required are plumbing to propagate if the
attribute is present to a CapabilityExpr, and introducing
ReentrancyDepth to the LockableFactEntry class.
Diffstat (limited to 'clang/lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | clang/lib/Sema/AnalysisBasedWarnings.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index d95844c..2a107a36 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -1907,7 +1907,8 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { void handleMutexHeldEndOfScope(StringRef Kind, Name LockName, SourceLocation LocLocked, SourceLocation LocEndOfScope, - LockErrorKind LEK) override { + LockErrorKind LEK, + bool ReentrancyMismatch) override { unsigned DiagID = 0; switch (LEK) { case LEK_LockedSomePredecessors: @@ -1926,8 +1927,9 @@ class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler { if (LocEndOfScope.isInvalid()) LocEndOfScope = FunEndLocation; - PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) << Kind - << LockName); + PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) + << Kind << LockName + << ReentrancyMismatch); Warnings.emplace_back(std::move(Warning), makeLockedHereNote(LocLocked, Kind)); } |