1 | // RUN: %clang_analyze_cc1 -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 -DNO_OS_OBJECT -verify %s \ |
6 | // RUN: -analyzer-checker=core,osx \ |
7 | // RUN: -analyzer-disable-checker osx.OSObjectRetainCount |
8 | // |
9 | // RUN: %clang_analyze_cc1 -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 | |