Skip to content

Commit 65c895d

Browse files
authored
[alpha.webkit.UnretainedCallArgsChecker] Treat getter on a dependent smart pointer type as safe (llvm#161025)
Add the support for recognizing smart pointer type appearing as the type of the object pointer in CXXDependentScopeMemberExpr.
1 parent 62adc83 commit 65c895d

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,14 @@ bool tryToFindPtrOrigin(
173173
if (isSingleton(E->getFoundDecl()))
174174
return callback(E, true);
175175
}
176+
177+
if (auto *MemberExpr = dyn_cast<CXXDependentScopeMemberExpr>(CalleeE)) {
178+
auto *Base = MemberExpr->getBase();
179+
auto MemberName = MemberExpr->getMember().getAsString();
180+
bool IsGetter = MemberName == "get" || MemberName == "ptr";
181+
if (Base && isSafePtrType(Base->getType()) && IsGetter)
182+
return callback(E, true);
183+
}
176184
}
177185

178186
// Sometimes, canonical type erroneously turns Ref<T> into T.

clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,35 @@ void foo() {
596596

597597
} // namespace sel_string
598598

599+
namespace template_function {
600+
601+
class Base {
602+
public:
603+
virtual ~Base() = default;
604+
void send(dispatch_queue_t) const;
605+
void ref() const;
606+
void deref() const;
607+
};
608+
609+
template<typename Traits>
610+
class Derived : public Base {
611+
public:
612+
virtual ~Derived() = default;
613+
614+
void send(typename Traits::MessageType) const;
615+
616+
virtual OSObjectPtr<dispatch_queue_t> msg(typename Traits::MessageType) const = 0;
617+
};
618+
619+
template<typename Traits>
620+
void Derived<Traits>::send(typename Traits::MessageType messageType) const
621+
{
622+
OSObjectPtr dictionary = msg(messageType);
623+
Base::send(dictionary.get());
624+
}
625+
626+
} // namespace template_function
627+
599628
@interface TestObject : NSObject
600629
- (void)doWork:(NSString *)msg, ...;
601630
- (void)doWorkOnSelf;

0 commit comments

Comments
 (0)