https://github.com/rniwa updated https://github.com/llvm/llvm-project/pull/80956
>From bc390afd3a2e9de6e2a883205ce3862e45d26e06 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Wed, 7 Feb 2024 00:57:00 -0800 Subject: [PATCH 1/2] [alpha.webkit.UncountedCallArgsChecker] Allow default arguments to be evaluated like other arguments. This PR aligns the evaluation of default arguments with other kinds of arguments by extracting the expressions within them as argument values to be evaluated. --- .../WebKit/UncountedCallArgsChecker.cpp | 3 ++ .../ref-countable-default-arg-nullptr.cpp | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp index 31ccae8b097b89..7cb0e4680d9e9e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp @@ -91,6 +91,9 @@ class UncountedCallArgsChecker const auto *Arg = CE->getArg(ArgIdx); + if (auto *defaultArg = dyn_cast<CXXDefaultArgExpr>(Arg)) + Arg = defaultArg->getExpr(); + std::pair<const clang::Expr *, bool> ArgOrigin = tryToFindPtrOrigin(Arg, true); diff --git a/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp b/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp new file mode 100644 index 00000000000000..cd38b335dcf85e --- /dev/null +++ b/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp @@ -0,0 +1,45 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s + +template <typename T> +class RefPtr { +public: + RefPtr(T* ptr) + : m_ptr(ptr) + { + if (m_ptr) + m_ptr->ref(); + } + + ~RefPtr() + { + if (m_ptr) + m_ptr->deref(); + } + + T* get() { return m_ptr; } + +private: + T* m_ptr; +}; + +class Obj { +public: + static Obj* get(); + static RefPtr<Obj> create(); + void ref() const; + void deref() const; +}; + +void someFunction(Obj*, Obj* = nullptr); +void otherFunction(Obj*, Obj* = Obj::get()); +// expected-warning@-1{{Call argument is uncounted and unsafe [alpha.webkit.UncountedCallArgsChecker]}} +void anotherFunction(Obj*, Obj* = Obj::create().get()); + +void otherFunction() { + someFunction(nullptr); + someFunction(Obj::get()); + // expected-warning@-1{{Call argument is uncounted and unsafe [alpha.webkit.UncountedCallArgsChecker]}} + someFunction(Obj::create().get()); + otherFunction(nullptr); + anotherFunction(nullptr); +} >From 4ca232820a5789155cdef2aa9768d715c3a874b8 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Fri, 9 Feb 2024 15:55:50 -0800 Subject: [PATCH 2/2] Use "mock-types.h" instead of embedding RefPtr in the test. --- .../ref-countable-default-arg-nullptr.cpp | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp b/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp index cd38b335dcf85e..a1860a5434c864 100644 --- a/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp +++ b/clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp @@ -1,26 +1,6 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s -template <typename T> -class RefPtr { -public: - RefPtr(T* ptr) - : m_ptr(ptr) - { - if (m_ptr) - m_ptr->ref(); - } - - ~RefPtr() - { - if (m_ptr) - m_ptr->deref(); - } - - T* get() { return m_ptr; } - -private: - T* m_ptr; -}; +#include "mock-types.h" class Obj { public: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits