Skip to content

Commit 8d9b522

Browse files
committed
[alpha.webkit.UnretainedCallArgsChecker] Treat NSStringFromSelector and alike as trivial and returns a retained value (llvm#161135)
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 8cd08a7 commit 8d9b522

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

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

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

166166
auto Name = safeGetName(callee);
167167
if (Name == "__builtin___CFStringMakeConstantString" ||
168-
Name == "NSClassFromString")
168+
Name == "NSStringFromSelector" || Name == "NSSelectorFromString" ||
169+
Name == "NSStringFromClass" || Name == "NSClassFromString" ||
170+
Name == "NSStringFromProtocol" || Name == "NSProtocolFromString")
169171
return callback(E, true);
170172
} else if (auto *CalleeE = call->getCallee()) {
171173
if (auto *E = dyn_cast<DeclRefExpr>(CalleeE->IgnoreParenCasts())) {
@@ -203,6 +205,8 @@ bool tryToFindPtrOrigin(
203205
!Selector.getNumArgs())
204206
return callback(E, true);
205207
}
208+
if (auto *ObjCProtocol = dyn_cast<ObjCProtocolExpr>(E))
209+
return callback(ObjCProtocol, true);
206210
if (auto *ObjCDict = dyn_cast<ObjCDictionaryLiteral>(E))
207211
return callback(ObjCDict, true);
208212
if (auto *ObjCArray = dyn_cast<ObjCArrayLiteral>(E))

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,20 @@ typedef CVImageBufferRef CVPixelBufferRef;
9898
typedef signed int CVReturn;
9999
CVReturn CVPixelBufferCreateWithIOSurface(CFAllocatorRef allocator, IOSurfaceRef surface, CFDictionaryRef pixelBufferAttributes, CF_RETURNS_RETAINED CVPixelBufferRef * pixelBufferOut);
100100

101+
extern "C" NSString *NSStringFromSelector(SEL aSelector);
102+
extern "C" SEL NSSelectorFromString(NSString *aSelectorName);
103+
104+
extern "C" NSString *NSStringFromClass(Class aClass);
105+
extern "C" Class NSClassFromString(NSString *aClassName);
106+
107+
extern "C" NSString *NSStringFromProtocol(Protocol *proto);
108+
extern "C" Protocol * NSProtocolFromString(NSString *namestr);
109+
101110
CFRunLoopRef CFRunLoopGetCurrent(void);
102111
CFRunLoopRef CFRunLoopGetMain(void);
103112
extern CFTypeRef CFRetain(CFTypeRef cf);
104113
extern void CFRelease(CFTypeRef cf);
105114
#define CFSTR(cStr) ((CFStringRef) __builtin___CFStringMakeConstantString ("" cStr ""))
106-
extern Class NSClassFromString(NSString *aClassName);
107115

108116
#if __has_feature(objc_arc)
109117
id CFBridgingRelease(CFTypeRef X) {

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

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

578578
} // autoreleased
579579

580+
namespace sel_string {
581+
582+
void consumeStr(NSString *);
583+
void consumeSel(SEL);
584+
void consumeClass(Class);
585+
void consumeProtocol(Protocol *);
586+
587+
void foo() {
588+
consumeStr(NSStringFromSelector(@selector(mutableCopy)));
589+
consumeSel(NSSelectorFromString(@"mutableCopy"));
590+
consumeStr(NSStringFromClass(NSNumber.class));
591+
consumeClass(NSClassFromString(@"NSNumber"));
592+
consumeStr(NSStringFromProtocol(@protocol(NSCopying)));
593+
consumeProtocol(NSProtocolFromString(@"NSCopying"));
594+
}
595+
596+
} // namespace sel_string
597+
580598
@interface TestObject : NSObject
581599
- (void)doWork:(NSString *)msg, ...;
582600
- (void)doWorkOnSelf;

0 commit comments

Comments
 (0)