Skip to content

Commit b2f3e37

Browse files
committed
[alpha.webkit.UnretainedCallArgsChecker] Treat getter on a dependent smart pointer type as safe
Add the support for recognizing smart pointer type appearing as the type of the object pointer in CXXDependentScopeMemberExpr.
1 parent 77a3d43 commit b2f3e37

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
@@ -165,6 +165,14 @@ bool tryToFindPtrOrigin(
165165
if (isSingleton(E->getFoundDecl()))
166166
return callback(E, true);
167167
}
168+
169+
if (auto *MemberExpr = dyn_cast<CXXDependentScopeMemberExpr>(CalleeE)) {
170+
auto *Base = MemberExpr->getBase();
171+
auto MemberName = MemberExpr->getMember().getAsString();
172+
bool IsGetter = MemberName == "get" || MemberName == "ptr";
173+
if (Base && isSafePtrType(Base->getType()) && IsGetter)
174+
return callback(E, true);
175+
}
168176
}
169177

170178
// 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
@@ -561,6 +561,35 @@ void foo() {
561561

562562
} // namespace ns_retained_return_value
563563

564+
namespace template_function {
565+
566+
class Base {
567+
public:
568+
virtual ~Base() = default;
569+
void send(dispatch_queue_t) const;
570+
void ref() const;
571+
void deref() const;
572+
};
573+
574+
template<typename Traits>
575+
class Derived : public Base {
576+
public:
577+
virtual ~Derived() = default;
578+
579+
void send(typename Traits::MessageType) const;
580+
581+
virtual OSObjectPtr<dispatch_queue_t> msg(typename Traits::MessageType) const = 0;
582+
};
583+
584+
template<typename Traits>
585+
void Derived<Traits>::send(typename Traits::MessageType messageType) const
586+
{
587+
OSObjectPtr dictionary = msg(messageType);
588+
Base::send(dictionary.get());
589+
}
590+
591+
} // namespace template_function
592+
564593
@interface TestObject : NSObject
565594
- (void)doWork:(NSString *)msg, ...;
566595
- (void)doWorkOnSelf;

0 commit comments

Comments
 (0)