Author: Ryosuke Niwa Date: 2024-11-13T16:28:01-08:00 New Revision: 73b577cc8c8a8ceeac87de5953a2c643e125d43e
URL: https://github.com/llvm/llvm-project/commit/73b577cc8c8a8ceeac87de5953a2c643e125d43e DIFF: https://github.com/llvm/llvm-project/commit/73b577cc8c8a8ceeac87de5953a2c643e125d43e.diff LOG: [WebKit checkers] Treat ref() and incrementCheckedPtrCount() as trivial (#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. Added: Modified: clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp clang/test/Analysis/Checkers/WebKit/call-args-checked-ptr.cpp clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 5412fea6f13230..94419cfd9e73eb 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -504,6 +504,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