Skip to content

Commit 596eb8e

Browse files
committed
Treat invocations of copy & isEqual selectors as safe.
1 parent 13b0a3e commit 596eb8e

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,18 @@ class RawPtrRefCallArgsChecker
177177
return;
178178

179179
auto Selector = E->getSelector();
180+
auto SelName = Selector.getNameForSlot(0);
181+
bool IsSafeSel = SelName.starts_with("copy") || SelName.contains("Copy") ||
182+
SelName == "isEqual" || SelName == "isEqualToString";
183+
if (Selector.getNumArgs() <= 1 && IsSafeSel)
184+
return; // These selectors are assumed to be readonly.
185+
180186
if (auto *Receiver = E->getInstanceReceiver()) {
181187
std::optional<bool> IsUnsafe = isUnsafePtr(E->getReceiverType());
182188
if (IsUnsafe && *IsUnsafe && !isPtrOriginSafe(Receiver)) {
183189
if (auto *InnerMsg =
184190
dyn_cast<ObjCMessageExpr>(Receiver->IgnoreParenCasts())) {
185191
auto InnerSelector = InnerMsg->getSelector();
186-
auto SelName = Selector.getNameForSlot(0);
187192
if (InnerSelector.getNameForSlot(0).starts_with("alloc") &&
188193
(SelName.starts_with("init") || SelName.starts_with("_init")))
189194
return;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ __attribute__((objc_root_class))
146146
- ( const char *)UTF8String;
147147
- (id)initWithUTF8String:(const char *)nullTerminatedCString;
148148
- (NSString *)copy;
149+
- (NSString *)mutableCopy;
150+
- (BOOL)isEqualToString:(NSString *)aString;
149151
+ (id)stringWithUTF8String:(const char *)nullTerminatedCString;
150152
@end
151153

@@ -168,6 +170,7 @@ __attribute__((objc_root_class))
168170
+ (SomeObj *)sharedInstance;
169171
- (instancetype)_init;
170172
- (SomeObj *)mutableCopy;
173+
- (BOOL)isEqual:(SomeObj *)other;
171174
- (SomeObj *)copyWithValue:(int)value;
172175
- (void)doWork;
173176
- (SomeObj *)other;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
SomeObj *provide();
77
void consume_obj(SomeObj*);
88

9+
NSString *provide_str();
10+
911
CFMutableArrayRef provide_cf();
1012
void consume_cf(CFMutableArrayRef);
1113

@@ -592,6 +594,10 @@ - (void)doWorkOnSelf {
592594
[self doWork:@"hello", RetainPtr<SomeObj> { provide() }.get(), RetainPtr<CFMutableArrayRef> { provide_cf() }.get(), OSObjectPtr { provide_dispatch() }.get()];
593595
[self doWork:__null];
594596
[self doWork:nil];
597+
[provide() isEqual:provide()];
598+
[provide_str() isEqualToString:@"foo"];
599+
[provide_str() copyWithZone:nullptr];
600+
[provide_str() mutableCopy];
595601
}
596602

597603
- (SomeObj *)getSomeObj {

0 commit comments

Comments
 (0)