1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-disable-checker osx.cocoa.RetainCount -DNO_CF_OBJECT -verify %s 2 // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-disable-checker osx.OSObjectRetainCount -DNO_OS_OBJECT -verify %s 3 // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-config "osx.cocoa.RetainCount:CheckOSObject=false" -DNO_OS_OBJECT -verify %s 4 5 typedef const void * CFTypeRef; 6 extern CFTypeRef CFRetain(CFTypeRef cf); 7 extern void CFRelease(CFTypeRef cf); 8 9 #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) 10 extern CFTypeRef CFCreate() CF_RETURNS_RETAINED; 11 12 using size_t = decltype(sizeof(int)); 13 14 struct OSObject { 15 virtual void retain(); 16 virtual void release(); 17 18 static void * operator new(size_t size); 19 virtual ~OSObject(){} 20 }; 21 22 void cf_overrelease() { 23 CFTypeRef cf = CFCreate(); 24 CFRelease(cf); 25 CFRelease(cf); 26 #ifndef NO_CF_OBJECT 27 // expected-warning@-2{{Reference-counted object is used after it is released}} 28 #endif 29 } 30 31 void osobject_overrelease() { 32 OSObject *o = new OSObject; 33 o->release(); 34 o->release(); 35 #ifndef NO_OS_OBJECT 36 // expected-warning@-2{{Reference-counted object is used after it is released}} 37 #endif 38 } 39