80 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UnretainedLocalVarsChecker -fobjc-arc -verify %s2 3#import "objc-mock-types.h"4 5SomeObj *provide();6void someFunction();7 8namespace raw_ptr {9 10void foo() {11 SomeObj *bar = [[SomeObj alloc] init];12 [bar doWork];13}14 15void foo2() {16 SomeObj *bar = provide();17 [bar doWork];18}19 20void bar() {21 CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 10);22 // expected-warning@-1{{Local variable 'array' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}}23 CFArrayAppendValue(array, nullptr);24}25 26void baz() {27 auto queue = dispatch_queue_create("some queue", nullptr);28 dispatch_queue_get_label(queue);29}30 31} // namespace raw_ptr32 33namespace const_global {34 35extern NSString * const SomeConstant;36extern CFDictionaryRef const SomeDictionary;37extern dispatch_queue_t const SomeDispatch;38void doWork(NSString *, CFDictionaryRef, dispatch_queue_t);39void use_const_global() {40 doWork(SomeConstant, SomeDictionary, SomeDispatch);41}42 43NSString *provide_str();44CFDictionaryRef provide_dict();45dispatch_queue_t provide_dispatch();46void use_const_local() {47 NSString * const str = provide_str();48 CFDictionaryRef dict = provide_dict();49 // expected-warning@-1{{Local variable 'dict' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}}50 auto dispatch = provide_dispatch();51 doWork(str, dict, dispatch);52}53 54} // namespace const_global55 56@interface AnotherObj : NSObject57- (void)foo:(SomeObj *)obj;58@end59 60@implementation AnotherObj61- (void)foo:(SomeObj*)obj {62 SomeObj* obj2 = obj;63 SomeObj* obj3 = provide();64 obj = nullptr;65 [obj2 doWork];66 [obj3 doWork];67}68 69- (void)bar {70 CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 10);71 // expected-warning@-1{{Local variable 'array' is unretained and unsafe [alpha.webkit.UnretainedLocalVarsChecker]}}72 CFArrayAppendValue(array, nullptr);73}74 75- (void)baz {76 auto queue = dispatch_queue_create("some queue", nullptr);77 dispatch_queue_get_label(queue);78}79@end80