[clang] e6aae2a - [analyzer] Handle structured bindings in alpha.webkit.UncountedCallArgsChecker (#129424)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 2 20:30:09 PST 2025
Author: Oliver Hunt
Date: 2025-03-02T20:30:06-08:00
New Revision: e6aae2a4905982c10412e7f35b4f3c940a1a86f5
URL: https://github.com/llvm/llvm-project/commit/e6aae2a4905982c10412e7f35b4f3c940a1a86f5
DIFF: https://github.com/llvm/llvm-project/commit/e6aae2a4905982c10412e7f35b4f3c940a1a86f5.diff
LOG: [analyzer] Handle structured bindings in alpha.webkit.UncountedCallArgsChecker (#129424)
Simply add awareness of BindingDecl to the logic for identifying local
assignments.
Added:
clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
Modified:
clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
index dc86c4fcc64b1..58020ec4e084d 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
@@ -140,9 +140,14 @@ bool tryToFindPtrOrigin(
bool isASafeCallArg(const Expr *E) {
assert(E);
if (auto *Ref = dyn_cast<DeclRefExpr>(E)) {
- if (auto *D = dyn_cast_or_null<VarDecl>(Ref->getFoundDecl())) {
+ auto *FoundDecl = Ref->getFoundDecl();
+ if (auto *D = dyn_cast_or_null<VarDecl>(FoundDecl)) {
if (isa<ParmVarDecl>(D) || D->isLocalVarDecl())
return true;
+ } else if (auto *BD = dyn_cast_or_null<BindingDecl>(FoundDecl)) {
+ VarDecl *VD = BD->getHoldingVar();
+ if (VD && (isa<ParmVarDecl>(VD) || VD->isLocalVarDecl()))
+ return true;
}
}
if (isConstOwnerPtrMemberExpr(E))
diff --git a/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp b/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
new file mode 100644
index 0000000000000..012868fcb329a
--- /dev/null
+++ b/clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
@@ -0,0 +1,36 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s -std=c++2c
+// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedLocalVarsChecker -verify %s -std=c++2c
+
+// expected-no-diagnostics
+
+#include "mock-types.h"
+
+class Node {
+public:
+ Node* nextSibling() const;
+
+ void ref() const;
+ void deref() const;
+};
+
+template <class A, class B> struct pair {
+ A a;
+ B b;
+ template <unsigned I> requires ( I == 0 ) A& get();
+ template <unsigned I> requires ( I == 1 ) B& get();
+};
+
+namespace std {
+ template <class> struct tuple_size;
+ template <unsigned, class> struct tuple_element;
+ template <class A, class B> struct tuple_size<::pair<A, B>> { static constexpr int value = 2; };
+ template <class A, class B> struct tuple_element<0, ::pair<A, B>> { using type = A; };
+ template <class A, class B> struct tuple_element<1, ::pair<A, B>> { using type = B; };
+}
+
+pair<RefPtr<Node>, RefPtr<Node>> &getPair();
+
+static void testUnpackedAssignment() {
+ auto [a, b] = getPair();
+ a->nextSibling();
+}
More information about the cfe-commits
mailing list