diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 2 | ||||
-rw-r--r-- | clang/test/Analysis/test-separate-retaincount.cpp | 37 |
2 files changed, 38 insertions, 1 deletions
diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index cf92e2d6788..9c8bd78726a 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-output=text -verify %s +// RUN: %clang_analyze_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=text -verify %s struct OSMetaClass; diff --git a/clang/test/Analysis/test-separate-retaincount.cpp b/clang/test/Analysis/test-separate-retaincount.cpp new file mode 100644 index 00000000000..36bcc48df2b --- /dev/null +++ b/clang/test/Analysis/test-separate-retaincount.cpp @@ -0,0 +1,37 @@ +// 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 + +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 +} |