Skip to content

Commit 0fc3e40

Browse files
authored
[alpha.webkit.UncountedCallArgsChecker] Skip std::forward in tryToFindPtrOrigin. (#111222)
Ignore std::forward when it appears while looking for the pointer origin.
1 parent f2c5aa9 commit 0fc3e40

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ bool tryToFindPtrOrigin(
101101
if (isSingleton(callee))
102102
return callback(E, true);
103103

104+
if (callee->isInStdNamespace() && safeGetName(callee) == "forward") {
105+
E = call->getArg(0);
106+
continue;
107+
}
108+
104109
if (isPtrConversion(callee)) {
105110
E = call->getArg(0);
106111
continue;

clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,8 @@ class UnrelatedClass {
588588
getFieldTrivial().nonTrivial23();
589589
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
590590
}
591+
592+
void setField(RefCounted*);
591593
};
592594

593595
class UnrelatedClass2 {
@@ -598,11 +600,24 @@ class UnrelatedClass2 {
598600
RefCounted &getFieldTrivialRecursively() { return getFieldTrivial().getFieldTrivial(); }
599601
RefCounted *getFieldTrivialTernary() { return Field ? Field->getFieldTernary() : nullptr; }
600602

603+
template<typename T, typename ... AdditionalArgs>
604+
void callSetField(T&& item, AdditionalArgs&&... args)
605+
{
606+
item.setField(std::forward<AdditionalArgs>(args)...);
607+
}
608+
609+
template<typename T, typename ... AdditionalArgs>
610+
void callSetField2(T&& item, AdditionalArgs&&... args)
611+
{
612+
item.setField(std::move<AdditionalArgs>(args)...);
613+
}
614+
601615
void test() {
602616
getFieldTrivialRecursively().trivial1(); // no-warning
603617
getFieldTrivialTernary()->trivial2(); // no-warning
604618
getFieldTrivialRecursively().someFunction();
605619
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
620+
callSetField(getFieldTrivial(), refCountedObj()); // no-warning
606621
}
607622
};
608623

0 commit comments

Comments
 (0)