Skip to content

Commit 4710640

Browse files
committed
[alpha.webkit.UnretainedCallArgsChecker] Treat NSStringFromSelector and alike as trivial and returns a retained value
Treat NSStringFromSelector, NSSelectorFromString, NSStringFromClass, NSClassFromString, NSStringFromProtocol, and NSProtocolFromString as trivial, and treat their return values as a safe pointer origin since the return value of these functions don't need to be retained.
1 parent 77a3d43 commit 4710640

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ bool tryToFindPtrOrigin(
158158

159159
auto Name = safeGetName(callee);
160160
if (Name == "__builtin___CFStringMakeConstantString" ||
161-
Name == "NSClassFromString")
161+
Name == "NSStringFromSelector" || Name == "NSSelectorFromString" ||
162+
Name == "NSStringFromClass" || Name == "NSClassFromString" ||
163+
Name == "NSStringFromProtocol" || Name == "NSProtocolFromString")
162164
return callback(E, true);
163165
} else if (auto *CalleeE = call->getCallee()) {
164166
if (auto *E = dyn_cast<DeclRefExpr>(CalleeE->IgnoreParenCasts())) {
@@ -196,6 +198,8 @@ bool tryToFindPtrOrigin(
196198
!Selector.getNumArgs())
197199
return callback(E, true);
198200
}
201+
if (auto *ObjCProtocol = dyn_cast<ObjCProtocolExpr>(E))
202+
return callback(ObjCProtocol, true);
199203
if (auto *ObjCDict = dyn_cast<ObjCDictionaryLiteral>(E))
200204
return callback(ObjCDict, true);
201205
if (auto *ObjCArray = dyn_cast<ObjCArrayLiteral>(E))

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ typedef CVImageBufferRef CVPixelBufferRef;
8484
typedef signed int CVReturn;
8585
CVReturn CVPixelBufferCreateWithIOSurface(CFAllocatorRef allocator, IOSurfaceRef surface, CFDictionaryRef pixelBufferAttributes, CF_RETURNS_RETAINED CVPixelBufferRef * pixelBufferOut);
8686

87+
extern "C" NSString *NSStringFromSelector(SEL aSelector);
88+
extern "C" SEL NSSelectorFromString(NSString *aSelectorName);
89+
90+
extern "C" NSString *NSStringFromClass(Class aClass);
91+
extern "C" Class NSClassFromString(NSString *aClassName);
92+
93+
extern "C" NSString *NSStringFromProtocol(Protocol *proto);
94+
extern "C" Protocol * NSProtocolFromString(NSString *namestr);
95+
8796
CFRunLoopRef CFRunLoopGetCurrent(void);
8897
CFRunLoopRef CFRunLoopGetMain(void);
8998
extern CFTypeRef CFRetain(CFTypeRef cf);

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,24 @@ void foo() {
561561

562562
} // namespace ns_retained_return_value
563563

564+
namespace sel_string {
565+
566+
void consumeStr(NSString *);
567+
void consumeSel(SEL);
568+
void consumeClass(Class);
569+
void consumeProtocol(Protocol *);
570+
571+
void foo() {
572+
consumeStr(NSStringFromSelector(@selector(mutableCopy)));
573+
consumeSel(NSSelectorFromString(@"mutableCopy"));
574+
consumeStr(NSStringFromClass(NSNumber.class));
575+
consumeClass(NSClassFromString(@"NSNumber"));
576+
consumeStr(NSStringFromProtocol(@protocol(NSCopying)));
577+
consumeProtocol(NSProtocolFromString(@"NSCopying"));
578+
}
579+
580+
} // namespace sel_string
581+
564582
@interface TestObject : NSObject
565583
- (void)doWork:(NSString *)msg, ...;
566584
- (void)doWorkOnSelf;

0 commit comments

Comments
 (0)