-
Notifications
You must be signed in to change notification settings - Fork 12.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WebKit checkers] Treat ref() and incrementCheckedPtrCount() as trivial #115695
[WebKit checkers] Treat ref() and incrementCheckedPtrCount() as trivial #115695
Conversation
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.
@llvm/pr-subscribers-clang-static-analyzer-1 Author: Ryosuke Niwa (rniwa) ChangesTreat 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. Full diff: https://github.com/llvm/llvm-project/pull/115695.diff 3 Files Affected:
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
|
@llvm/pr-subscribers-clang Author: Ryosuke Niwa (rniwa) ChangesTreat 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. Full diff: https://github.com/llvm/llvm-project/pull/115695.diff 3 Files Affected:
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
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Thanks for the review! |
…al (llvm#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.
…al (llvm#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.
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.