llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-static-analyzer-1 Author: Ryosuke Niwa (rniwa) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/80956.diff 2 Files Affected: - (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp (+3) - (added) clang/test/Analysis/Checkers/WebKit/ref-countable-default-arg-nullptr.cpp (+45) ``````````diff 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); +} `````````` </details> https://github.com/llvm/llvm-project/pull/80956 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits