Skip to content

Commit b5d0278

Browse files
authored
Revert "[WebKit checkers] Recognize adoptRef as a safe function" (#120626)
Reverts #119846. Introduced a failing test.
1 parent d3508cc commit b5d0278

File tree

4 files changed

+12
-55
lines changed

4 files changed

+12
-55
lines changed

clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,9 @@ bool isCtorOfRefCounted(const clang::FunctionDecl *F) {
125125
assert(F);
126126
const std::string &FunctionName = safeGetName(F);
127127

128-
return isRefType(FunctionName) || FunctionName == "adoptRef" ||
129-
FunctionName == "UniqueRef" || FunctionName == "makeUniqueRef" ||
128+
return isRefType(FunctionName) || FunctionName == "makeRef" ||
129+
FunctionName == "makeRefPtr" || FunctionName == "UniqueRef" ||
130+
FunctionName == "makeUniqueRef" ||
130131
FunctionName == "makeUniqueRefWithoutFastMallocCheck"
131132

132133
|| FunctionName == "String" || FunctionName == "AtomString" ||

clang/test/Analysis/Checkers/WebKit/call-args.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -376,21 +376,3 @@ namespace call_with_explicit_temporary_obj {
376376

377377
namespace call_with_explicit_construct {
378378
}
379-
380-
namespace call_with_adopt_ref {
381-
class Obj {
382-
public:
383-
void ref() const;
384-
void deref() const;
385-
void method();
386-
};
387-
388-
// This is needed due to rdar://141692212.
389-
struct dummy {
390-
RefPtr<Obj> any;
391-
};
392-
393-
void foo() {
394-
adoptRef(new Obj)->method();
395-
}
396-
}

clang/test/Analysis/Checkers/WebKit/mock-types.h

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,7 @@ template<typename T> struct DefaultRefDerefTraits {
7474
template <typename T, typename PtrTraits = RawPtrTraits<T>, typename RefDerefTraits = DefaultRefDerefTraits<T>> struct Ref {
7575
typename PtrTraits::StorageType t;
7676

77-
enum AdoptTag { Adopt };
78-
7977
Ref() : t{} {};
80-
Ref(T &t, AdoptTag) : t(&t) { }
8178
Ref(T &t) : t(&RefDerefTraits::ref(t)) { }
8279
Ref(const Ref& o) : t(RefDerefTraits::refIfNotNull(PtrTraits::unwrap(o.t))) { }
8380
Ref(Ref&& o) : t(o.leakRef()) { }
@@ -104,19 +101,10 @@ template <typename T, typename PtrTraits = RawPtrTraits<T>, typename RefDerefTra
104101
T* leakRef() { return PtrTraits::exchange(t, nullptr); }
105102
};
106103

107-
template <typename T> Ref<T> adoptRef(T& t) {
108-
using Ref = Ref<T>;
109-
return Ref(t, Ref::Adopt);
110-
}
111-
112-
template<typename T> class RefPtr;
113-
template<typename T> RefPtr<T> adoptRef(T*);
114-
115104
template <typename T> struct RefPtr {
116105
T *t;
117106

118-
RefPtr() : t(nullptr) { }
119-
107+
RefPtr() : t(new T) {}
120108
RefPtr(T *t)
121109
: t(t) {
122110
if (t)
@@ -125,17 +113,6 @@ template <typename T> struct RefPtr {
125113
RefPtr(Ref<T>&& o)
126114
: t(o.leakRef())
127115
{ }
128-
RefPtr(RefPtr&& o)
129-
: t(o.t)
130-
{
131-
o.t = nullptr;
132-
}
133-
RefPtr(const RefPtr& o)
134-
: t(o.t)
135-
{
136-
if (t)
137-
t->ref();
138-
}
139116
~RefPtr() {
140117
if (t)
141118
t->deref();
@@ -161,19 +138,8 @@ template <typename T> struct RefPtr {
161138
return *this;
162139
}
163140
operator bool() const { return t; }
164-
165-
private:
166-
friend RefPtr adoptRef<T>(T*);
167-
168-
// call_with_adopt_ref in call-args.cpp requires this method to be private.
169-
enum AdoptTag { Adopt };
170-
RefPtr(T *t, AdoptTag) : t(t) { }
171141
};
172142

173-
template <typename T> RefPtr<T> adoptRef(T* t) {
174-
return RefPtr<T>(t, RefPtr<T>::Adopt);
175-
}
176-
177143
template <typename T> bool operator==(const RefPtr<T> &, const RefPtr<T> &) {
178144
return false;
179145
}

clang/test/Analysis/Checkers/WebKit/ref-cntbl-crtp-base-no-virtual-dtor.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ template<typename Out, typename... In> Function<Out(In...)> adopt(Detail::Callab
6161
return Function<Out(In...)>(impl, Function<Out(In...)>::Adopt);
6262
}
6363

64+
template<typename T, typename PtrTraits = RawPtrTraits<T>, typename RefDerefTraits = DefaultRefDerefTraits<T>> Ref<T, PtrTraits, RefDerefTraits> adoptRef(T&);
65+
66+
template<typename T, typename _PtrTraits, typename RefDerefTraits>
67+
inline Ref<T, _PtrTraits, RefDerefTraits> adoptRef(T& reference)
68+
{
69+
return Ref<T, _PtrTraits, RefDerefTraits>(reference);
70+
}
71+
6472
enum class DestructionThread : unsigned char { Any, Main, MainRunLoop };
6573
void ensureOnMainThread(Function<void()>&&); // Sync if called on main thread, async otherwise.
6674
void ensureOnMainRunLoop(Function<void()>&&); // Sync if called on main run loop, async otherwise.

0 commit comments

Comments
 (0)