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