diff options
Diffstat (limited to 'test/Analysis/retain-release-cf-audited.m')
-rw-r--r-- | test/Analysis/retain-release-cf-audited.m | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/test/Analysis/retain-release-cf-audited.m b/test/Analysis/retain-release-cf-audited.m new file mode 100644 index 0000000..c89172f --- /dev/null +++ b/test/Analysis/retain-release-cf-audited.m @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -verify %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -verify %s -x objective-c++ + +// The special thing about this file is that CFRetain and CFRelease are marked +// as cf_audited_transfer. + +#pragma clang arc_cf_code_audited begin +typedef const void * CFTypeRef; +extern CFTypeRef CFRetain(CFTypeRef cf); +extern void CFRelease(CFTypeRef cf); + +extern CFTypeRef CFCreateSomethingAudited(); +#pragma clang arc_cf_code_audited end + +extern CFTypeRef CFCreateSomethingUnaudited(); + +void testAudited() { + CFTypeRef obj = CFCreateSomethingAudited(); // no-warning + CFRelease(obj); // no-warning + + CFTypeRef obj2 = CFCreateSomethingAudited(); // expected-warning{{leak}} + CFRetain(obj2); // no-warning + CFRelease(obj2); // no-warning +} + +void testUnaudited() { + CFTypeRef obj = CFCreateSomethingUnaudited(); // no-warning + CFRelease(obj); // no-warning + + CFTypeRef obj2 = CFCreateSomethingUnaudited(); // expected-warning{{leak}} + CFRetain(obj2); // no-warning + CFRelease(obj2); // no-warning +} |