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();
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to