[clang] [webkit.UncountedLambdaCapturesChecker] Ignore a lambda which gets called immediately (PR #162977)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 10 23:46:31 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-static-analyzer-1
@llvm/pr-subscribers-clang
Author: Ryosuke Niwa (rniwa)
<details>
<summary>Changes</summary>
Recognize more ways in which a lambda can be declared and called immediately.
---
Full diff: https://github.com/llvm/llvm-project/pull/162977.diff
2 Files Affected:
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLambdaCapturesChecker.cpp (+10)
- (modified) clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp (+17)
``````````diff
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLambdaCapturesChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLambdaCapturesChecker.cpp
index 033eb8cc299b0..6b3a4a77e30c7 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLambdaCapturesChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLambdaCapturesChecker.cpp
@@ -253,6 +253,16 @@ class RawPtrRefLambdaCapturesChecker
auto *Callee = CE->getCallee();
if (!Callee)
return;
+ Callee = Callee->IgnoreParenCasts();
+ if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Callee))
+ Callee = MTE->getSubExpr();
+ if (!Callee)
+ return;
+ Callee = Callee->IgnoreParenCasts();
+ if (auto* L = dyn_cast_or_null<LambdaExpr>(Callee)) {
+ LambdasToIgnore.insert(L); // Calling a lambda upon creation is safe.
+ return;
+ }
auto *DRE = dyn_cast<DeclRefExpr>(Callee->IgnoreParenCasts());
if (!DRE)
return;
diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
index a4ad741182f56..7a8a433e9a7ca 100644
--- a/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
@@ -439,6 +439,23 @@ void capture_copy_in_lambda(CheckedObj& checked) {
});
}
+struct TemplateFunctionCallsLambda {
+ void ref() const;
+ void deref() const;
+
+ RefCountable* obj();
+
+ template <typename T>
+ RefPtr<T> method(T* t) {
+ auto ret = ([&]() -> RefPtr<T> {
+ if constexpr (T::isEncodable)
+ return t;
+ return obj() ? t : nullptr;
+ })();
+ return ret;
+ }
+};
+
class Iterator {
public:
Iterator(void* array, unsigned long sizeOfElement, unsigned int index);
``````````
</details>
https://github.com/llvm/llvm-project/pull/162977
More information about the cfe-commits
mailing list