78 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UnretainedCallArgsChecker -fobjc-arc -verify %s2 3#import "objc-mock-types.h"4 5SomeObj *provide();6CFMutableArrayRef provide_cf();7dispatch_queue_t provide_os();8void someFunction();9CGImageRef provideImage();10NSString *stringForImage(CGImageRef);11 12namespace raw_ptr {13 14void foo() {15 [provide() doWork];16 CFArrayAppendValue(provide_cf(), nullptr);17 // expected-warning@-1{{Call argument for parameter 'theArray' is unretained and unsafe [alpha.webkit.UnretainedCallArgsChecker]}}18 dispatch_queue_get_label(provide_os());19}20 21} // namespace raw_ptr22 23namespace const_global {24 25extern NSString * const SomeConstant;26extern CFDictionaryRef const SomeDictionary;27extern dispatch_queue_t const SomeDispatch;28void doWork(NSString *str, CFDictionaryRef dict, dispatch_queue_t dispatch);29void use_const_global() {30 doWork(SomeConstant, SomeDictionary, SomeDispatch);31}32 33NSString *provide_str();34CFDictionaryRef provide_dict();35dispatch_queue_t provide_dispatch();36void use_const_local() {37 doWork(provide_str(), provide_dict(), provide_dispatch());38 // expected-warning@-1{{Call argument for parameter 'dict' is unretained and unsafe}}39}40 41} // namespace const_global42 43@interface AnotherObj : NSObject44- (void)foo:(SomeObj *)obj;45- (SomeObj *)getSomeObj;46@end47 48@implementation AnotherObj49- (void)foo:(SomeObj*)obj {50 [obj doWork];51 [provide() doWork];52 CFArrayAppendValue(provide_cf(), nullptr);53 // expected-warning@-1{{Call argument for parameter 'theArray' is unretained and unsafe [alpha.webkit.UnretainedCallArgsChecker]}}54}55 56- (SomeObj *)getSomeObj {57 return provide();58}59 60- (void)doWorkOnSomeObj {61 [[self getSomeObj] doWork];62}63 64- (CGImageRef)createImage {65 return provideImage();66}67 68- (NSString *)convertImage {69 RetainPtr<CGImageRef> image = [self createImage];70 return stringForImage(image.get());71}72 73- (const char *)dispatchLabel {74 OSObjectPtr obj = provide_os();75 return dispatch_queue_get_label(obj.get());76}77@end78