diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:04:05 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:04:05 +0000 |
| commit | 676fbe8105eeb6ff4bb2ed261cb212fcfdbe7b63 (patch) | |
| tree | 02a1ac369cb734d0abfa5000dd86e5b7797e6a74 /test/Analysis/test-separate-retaincount.cpp | |
| parent | c7e70c433efc6953dc3888b9fbf9f3512d7da2b0 (diff) | |
Notes
Diffstat (limited to 'test/Analysis/test-separate-retaincount.cpp')
| -rw-r--r-- | test/Analysis/test-separate-retaincount.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/test/Analysis/test-separate-retaincount.cpp b/test/Analysis/test-separate-retaincount.cpp new file mode 100644 index 000000000000..be6534f544bd --- /dev/null +++ b/test/Analysis/test-separate-retaincount.cpp @@ -0,0 +1,38 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-disable-checker osx.cocoa.RetainCount -DNO_CF_OBJECT -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-disable-checker osx.OSObjectRetainCount -DNO_OS_OBJECT -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-config "osx.cocoa.RetainCount:CheckOSObject=false" -DNO_OS_OBJECT -verify %s + +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)); + +struct OSObject { + virtual void retain(); + virtual void release(); + + static void * operator new(size_t size); + virtual ~OSObject(){} +}; + +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 +} |
