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