Skip to content

Commit aca48a4

Browse files
authored
Add the support for recognizing WTF::move like std::move (#170820)
This PR adds support for treating WTF::move like std::move in various WebKit checkers.
1 parent dde1990 commit aca48a4

File tree

11 files changed

+50
-14
lines changed

11 files changed

+50
-14
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,6 @@ bool tryToFindPtrOrigin(
132132
}
133133
}
134134

135-
if (call->isCallToStdMove() && call->getNumArgs() == 1) {
136-
E = call->getArg(0)->IgnoreParenCasts();
137-
continue;
138-
}
139-
140135
if (auto *callee = call->getDirectCallee()) {
141136
if (isCtorOfSafePtr(callee)) {
142137
if (StopAtFirstRefCountedObj)
@@ -146,6 +141,11 @@ bool tryToFindPtrOrigin(
146141
continue;
147142
}
148143

144+
if (isStdOrWTFMove(callee) && call->getNumArgs() == 1) {
145+
E = call->getArg(0)->IgnoreParenCasts();
146+
continue;
147+
}
148+
149149
if (isSafePtrType(callee->getReturnType()))
150150
return callback(E, true);
151151

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,7 @@ class ForwardDeclChecker : public Checker<check::ASTDecl<TranslationUnitDecl>> {
267267
ArgExpr = ArgExpr->IgnoreParenCasts();
268268
if (auto *InnerCE = dyn_cast<CallExpr>(ArgExpr)) {
269269
auto *InnerCallee = InnerCE->getDirectCallee();
270-
if (InnerCallee && InnerCallee->isInStdNamespace() &&
271-
safeGetName(InnerCallee) == "move" && InnerCE->getNumArgs() == 1) {
270+
if (isStdOrWTFMove(InnerCallee) && InnerCE->getNumArgs() == 1) {
272271
ArgExpr = InnerCE->getArg(0);
273272
continue;
274273
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,18 @@ bool isCtorOfSafePtr(const clang::FunctionDecl *F) {
185185
isCtorOfRetainPtrOrOSPtr(F);
186186
}
187187

188+
bool isStdOrWTFMove(const clang::FunctionDecl *F) {
189+
auto FnName = safeGetName(F);
190+
auto *Namespace = F->getParent();
191+
if (!Namespace)
192+
return false;
193+
auto *TUDeck = Namespace->getParent();
194+
if (!isa_and_nonnull<TranslationUnitDecl>(TUDeck))
195+
return false;
196+
auto NsName = safeGetName(Namespace);
197+
return (NsName == "WTF" || NsName == "std") && FnName == "move";
198+
}
199+
188200
template <typename Predicate>
189201
static bool isPtrOfType(const clang::QualType T, Predicate Pred) {
190202
QualType type = T;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ bool isCtorOfCheckedPtr(const clang::FunctionDecl *F);
134134
/// uncounted parameter, false if not.
135135
bool isCtorOfSafePtr(const clang::FunctionDecl *F);
136136

137+
/// \returns true if \p F is std::move or WTF::move.
138+
bool isStdOrWTFMove(const clang::FunctionDecl *F);
139+
137140
/// \returns true if \p Name is RefPtr, Ref, or its variant, false if not.
138141
bool isRefType(const std::string &Name);
139142

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -416,12 +416,9 @@ class RawPtrRefLambdaCapturesChecker
416416
return false;
417417
}
418418
if (auto *CE = dyn_cast<CallExpr>(Arg)) {
419-
if (CE->isCallToStdMove() && CE->getNumArgs() == 1) {
420-
Arg = CE->getArg(0)->IgnoreParenCasts();
421-
continue;
422-
}
423419
if (auto *Callee = CE->getDirectCallee()) {
424-
if (isCtorOfSafePtr(Callee) && CE->getNumArgs() == 1) {
420+
if ((isStdOrWTFMove(Callee) || isCtorOfSafePtr(Callee)) &&
421+
CE->getNumArgs() == 1) {
425422
Arg = CE->getArg(0)->IgnoreParenCasts();
426423
continue;
427424
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ namespace call_with_std_move {
8080
void consume(CheckedObj&&);
8181
void foo(CheckedObj&& obj) {
8282
consume(std::move(obj));
83+
consume(WTF::move(obj));
8384
}
8485

8586
}

clang/test/Analysis/Checkers/WebKit/forward-decl-checker.mm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ void opaque_call_arg(Obj* obj, Obj&& otherObj, const RefPtr<Obj>& safeObj, WeakP
4444
receive_obj_ref(*obj);
4545
receive_obj_ptr(&*obj);
4646
receive_obj_rref(std::move(otherObj));
47+
receive_obj_rref(WTF::move(otherObj));
4748
receive_obj_ref(*safeObj.get());
4849
receive_obj_ptr(weakObj.get());
4950
// expected-warning@-1{{Call argument for parameter 'p' uses a forward declared type 'Obj *'}}
@@ -59,6 +60,7 @@ void rval(Obj&& arg) {
5960
auto &&obj = provide_obj_rval();
6061
// expected-warning@-1{{Local variable 'obj' uses a forward declared type 'Obj &&'}}
6162
receive_obj_rval(std::move(arg));
63+
receive_obj_rval(WTF::move(arg));
6264
}
6365

6466
ObjCObj *provide_objcobj();
@@ -84,6 +86,7 @@ void construct_ptr(Obj&& arg) {
8486
WrapperObj wrapper2(provide_obj_ref());
8587
// expected-warning@-1{{Call argument for parameter 'obj' uses a forward declared type 'Obj &'}}
8688
WrapperObj wrapper3(std::move(arg));
89+
WrapperObj wrapper4(WTF::move(arg));
8790
}
8891

8992
JSStringRef provide_opaque_ptr();

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ template<typename T> typename remove_reference<T>::type&& move(T&& t);
1717

1818
#endif
1919

20+
namespace WTF {
21+
22+
template<typename T> typename std::remove_reference<T>::type&& move(T&& t);
23+
24+
}
25+
2026
#ifndef mock_types_1103988513531
2127
#define mock_types_1103988513531
2228

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ template<typename T> typename remove_reference<T>::type&& move(T&& t);
1717

1818
#endif
1919

20+
namespace WTF {
21+
22+
template<typename T> typename std::remove_reference<T>::type&& move(T&& t);
23+
24+
}
25+
2026
namespace std {
2127

2228
template <bool, typename U = void> struct enable_if {
@@ -453,7 +459,7 @@ template<typename T> class OSObjectPtr {
453459
}
454460

455461
OSObjectPtr(T ptr)
456-
: m_ptr(std::move(ptr))
462+
: m_ptr(WTF::move(ptr))
457463
{
458464
if (m_ptr)
459465
retainOSObject(m_ptr);
@@ -483,7 +489,7 @@ template<typename T> class OSObjectPtr {
483489

484490
OSObjectPtr& operator=(T other)
485491
{
486-
OSObjectPtr ptr = std::move(other);
492+
OSObjectPtr ptr = WTF::move(other);
487493
swap(ptr);
488494
return *this;
489495
}

clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,14 @@ struct RefCountableWithLambdaCapturingThis {
437437
});
438438
});
439439
}
440+
441+
void method_nested_lambda4() {
442+
callAsync([this, protectedThis = RefPtr { this }] {
443+
callAsync([this, protectedThis = WTF::move(*protectedThis)] {
444+
nonTrivial();
445+
});
446+
});
447+
}
440448
};
441449

442450
struct NonRefCountableWithLambdaCapturingThis {

0 commit comments

Comments
 (0)