https://github.com/rniwa created https://github.com/llvm/llvm-project/pull/115695
Treat member function calls to ref() and incrementCheckedPtrCount() as trivial so that a function which returns RefPtr/Ref out of a raw reference / pointer is also considered trivial. >From 7b4aaedcf86d583c1cf865f7c96d8da1a5459fd5 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Mon, 11 Nov 2024 00:23:20 -0800 Subject: [PATCH] [WebKit checkers] Treat ref() and incrementCheckedPtrCount() as trivial Treat member function calls to ref() and incrementCheckedPtrCount() as trivial so that a function which returns RefPtr/Ref out of a raw reference / pointer is also considered trivial. --- .../Checkers/WebKit/PtrTypesSemantics.cpp | 4 ++++ .../Checkers/WebKit/call-args-checked-ptr.cpp | 19 +++++++++++++++++++ .../Checkers/WebKit/uncounted-obj-arg.cpp | 4 ++++ 3 files changed, 27 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 31bebdb07dbdc2..08fce7e0fa564a 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -498,6 +498,10 @@ class TrivialFunctionAnalysisVisitor if (!Callee) return false; + auto Name = safeGetName(Callee); + if (Name == "ref" || Name == "incrementCheckedPtrCount") + return true; + std::optional<bool> IsGetterOfRefCounted = isGetterOfSafePtr(Callee); if (IsGetterOfRefCounted && *IsGetterOfRefCounted) return true; diff --git a/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp b/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp index 34ff0c70e230ea..072bceedcf9610 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp @@ -365,3 +365,22 @@ namespace call_with_explicit_temporary_obj { CheckedPtr { provide() }->method(); } } + +namespace call_with_checked_ptr { + + class Foo : public CheckedObj { + public: + CheckedPtr<CheckedObj> obj1() { return m_obj; } + CheckedRef<CheckedObj> obj2() { return *m_obj; } + private: + CheckedObj* m_obj; + }; + + Foo* getFoo(); + + void bar() { + getFoo()->obj1()->method(); + getFoo()->obj2()->method(); + } + +} diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp index e1dacdd9e25b6d..d654d963a4faef 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp @@ -366,6 +366,8 @@ class RefCounted { void trivial65() { __libcpp_verbose_abort("%s", "aborting"); } + RefPtr<RefCounted> trivial66() { return children[0]; } + Ref<RefCounted> trivial67() { return *children[0]; } static RefCounted& singleton() { static RefCounted s_RefCounted; @@ -550,6 +552,8 @@ class UnrelatedClass { getFieldTrivial().trivial63(); // no-warning getFieldTrivial().trivial64(); // no-warning getFieldTrivial().trivial65(); // no-warning + getFieldTrivial().trivial66()->trivial6(); // no-warning + getFieldTrivial().trivial67()->trivial6(); // no-warning RefCounted::singleton().trivial18(); // no-warning RefCounted::singleton().someFunction(); // no-warning _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits