[clang] d5a2638 - [webkit.UncountedLambdaCapturesChecker] Fix a bug that the checker didn't take the object pointer into account. (#125662)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 4 21:51:19 PST 2025
Author: Ryosuke Niwa
Date: 2025-02-04T21:51:16-08:00
New Revision: d5a2638ae98746d9382231a0f04b11a5415b5e8e
URL: https://github.com/llvm/llvm-project/commit/d5a2638ae98746d9382231a0f04b11a5415b5e8e
DIFF: https://github.com/llvm/llvm-project/commit/d5a2638ae98746d9382231a0f04b11a5415b5e8e.diff
LOG: [webkit.UncountedLambdaCapturesChecker] Fix a bug that the checker didn't take the object pointer into account. (#125662)
When a callee is a method call (e.g. calling a lambda), we need to skip
the object pointer to match the parameter list with the call arguments.
This manifests as a bug that the checker erroneously generate a warning
for a lambda capture (L1) which is passed to a no-escape argument of
another lambda (L2).
Added:
Modified:
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
index a57499d52acd0c..53ef423bd82e7e 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
@@ -109,8 +109,10 @@ class UncountedLambdaCapturesChecker
bool VisitCallExpr(CallExpr *CE) override {
checkCalleeLambda(CE);
if (auto *Callee = CE->getDirectCallee()) {
- bool TreatAllArgsAsNoEscape = shouldTreatAllArgAsNoEscape(Callee);
unsigned ArgIndex = 0;
+ if (auto *CXXCallee = dyn_cast<CXXMethodDecl>(Callee))
+ ArgIndex = CXXCallee->isInstance();
+ bool TreatAllArgsAsNoEscape = shouldTreatAllArgAsNoEscape(Callee);
for (auto *Param : Callee->parameters()) {
if (ArgIndex >= CE->getNumArgs())
return true;
diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
index 2173245bc7af3e..2a1a164557cdbe 100644
--- a/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
@@ -252,13 +252,22 @@ struct RefCountableWithLambdaCapturingThis {
call(lambda);
}
- void method_captures_this_with_guardian_refPtr() {
+ void method_captures_this_with_guardian_refptr() {
auto lambda = [this, protectedThis = RefPtr { &*this }]() {
nonTrivial();
};
call(lambda);
}
+ void forEach(const WTF::Function<void(RefCountable&)>&);
+ void method_captures_this_with_lambda_with_no_escape() {
+ auto run = [&]([[clang::noescape]] const WTF::Function<void(RefCountable&)>& func) {
+ forEach(func);
+ };
+ run([&](RefCountable&) {
+ nonTrivial();
+ });
+ }
};
struct NonRefCountableWithLambdaCapturingThis {
More information about the cfe-commits
mailing list