| // RUN: %clang_analyze_cc1 -std=c++14 -DNO_CF_OBJECT -verify %s \ |
| // RUN: -analyzer-checker=core,osx \ |
| // RUN: -analyzer-disable-checker osx.cocoa.RetainCount |
| // |
| // RUN: %clang_analyze_cc1 -std=c++14 -DNO_OS_OBJECT -verify %s \ |
| // RUN: -analyzer-checker=core,osx \ |
| // RUN: -analyzer-disable-checker osx.OSObjectRetainCount |
| // |
| // RUN: %clang_analyze_cc1 -std=c++14 -DNO_OS_OBJECT -verify %s \ |
| // RUN: -analyzer-checker=core,osx \ |
| // RUN: -analyzer-config "osx.cocoa.RetainCount:CheckOSObject=false" |
| |
| #include "os_object_base.h" |
| |
| typedef const void * CFTypeRef; |
| extern CFTypeRef CFRetain(CFTypeRef cf); |
| extern void CFRelease(CFTypeRef cf); |
| |
| #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) |
| extern CFTypeRef CFCreate() CF_RETURNS_RETAINED; |
| |
| using size_t = decltype(sizeof(int)); |
| |
| void cf_overrelease() { |
| CFTypeRef cf = CFCreate(); |
| CFRelease(cf); |
| CFRelease(cf); |
| #ifndef NO_CF_OBJECT |
| // expected-warning@-2{{Reference-counted object is used after it is released}} |
| #endif |
| } |
| |
| void osobject_overrelease() { |
| OSObject *o = new OSObject; |
| o->release(); |
| o->release(); |
| #ifndef NO_OS_OBJECT |
| // expected-warning@-2{{Reference-counted object is used after it is released}} |
| #endif |
| } |