[clang] [WebKit checkers] Treat ref() and incrementCheckedPtrCount() as trivial (PR #115695)
Ryosuke Niwa via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 11 00:38:44 PST 2024
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 <rniwa at 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
More information about the cfe-commits
mailing list