[clang] Thread Safety Analysis: Check managed capabilities of returned scoped capability (PR #131831)
Aaron Puchert via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 19 09:14:35 PDT 2025
================
@@ -2316,6 +2337,49 @@ void BuildLockset::VisitReturnStmt(const ReturnStmt *S) {
ReturnType->getPointeeType().isConstQualified() ? AK_Read : AK_Written,
POK_ReturnPointer);
}
+
+ if (!checkRecordTypeForScopedCapability(ReturnType))
+ return;
+
+ if (const auto *CBTE = dyn_cast<ExprWithCleanups>(RetVal))
+ RetVal = CBTE->getSubExpr();
+ RetVal = RetVal->IgnoreCasts();
+ if (const auto *CBTE = dyn_cast<CXXBindTemporaryExpr>(RetVal))
+ RetVal = CBTE->getSubExpr();
+ CapabilityExpr Cp;
+ if (auto Object = Analyzer->ConstructedObjects.find(RetVal);
+ Object != Analyzer->ConstructedObjects.end()) {
+ Cp = CapabilityExpr(Object->second, StringRef(), false);
+ Analyzer->ConstructedObjects.erase(Object);
+ }
+ if (!Cp.shouldIgnore()) {
+ const FactEntry *Fact = FSet.findLock(Analyzer->FactMan, Cp);
+ if (const ScopedLockableFactEntry *Scope =
+ cast_or_null<ScopedLockableFactEntry>(Fact)) {
+ CapExprSet LocksInReturnVal = Scope->getUnderlyingMutexes();
+ for (const auto &[a, b] : zip_longest(
+ Analyzer->ExpectedReturnedCapabilities, LocksInReturnVal)) {
+ if (!a.has_value()) {
+ Analyzer->Handler.handleExpectFewerUnderlyingMutexes(
+ RetVal->getExprLoc(), Analyzer->CurrentFunction->getLocation(),
+ Scope->toString(), b.value().getKind(), b.value().toString(),
+ false);
----------------
aaronpuchert wrote:
Also here: add comments on the parameter.
https://github.com/llvm/llvm-project/pull/131831
More information about the cfe-commits
mailing list