Skip to content

Commit d3c71af

Browse files
committed
[alpha.webkit.UncountedCallArgsChecker] Skip std::forward in tryToFindPtrOrigin. (llvm#111222)
Ignore std::forward when it appears while looking for the pointer origin.
1 parent 0891037 commit d3c71af

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ bool tryToFindPtrOrigin(
102102
if (isSingleton(callee))
103103
return callback(E, true);
104104

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

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

Lines changed: 15 additions & 0 deletions
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)