| // RUN: clang -checker-cfref -pedantic -verify %s |
| |
| //===----------------------------------------------------------------------===// |
| // The following code is reduced using delta-debugging from |
| // CoreFoundation.h (Mac OS X). |
| // |
| // It includes the basic definitions for the test cases below. |
| // Not directly including CoreFoundation.h directly makes this test case |
| // both svelte and portable to non-Mac platforms. |
| //===----------------------------------------------------------------------===// |
| |
| typedef unsigned long UInt32; |
| typedef unsigned char Boolean; |
| typedef signed long CFIndex; |
| typedef const void * CFTypeRef; |
| typedef const struct __CFString * CFStringRef; |
| typedef struct { CFIndex location; } CFRange; |
| typedef const struct __CFAllocator * CFAllocatorRef; |
| extern void CFRelease(CFTypeRef cf); |
| typedef Boolean (*CFArrayEqualCallBack)(const void *value1, const void *value2); |
| typedef struct { CFArrayEqualCallBack equal; } CFArrayCallBacks; |
| extern const CFArrayCallBacks kCFTypeArrayCallBacks; |
| typedef const struct __CFArray * CFArrayRef; |
| typedef struct __CFArray * CFMutableArrayRef; |
| extern CFMutableArrayRef CFArrayCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFArrayCallBacks *callBacks); |
| extern const void *CFArrayGetValueAtIndex(CFArrayRef theArray, CFIndex idx); |
| extern void CFArrayAppendValue(CFMutableArrayRef theArray, const void *value); |
| typedef UInt32 CFStringEncoding; |
| enum { kCFStringEncodingMacRoman = 0, kCFStringEncodingWindowsLatin1 = 0x0500, kCFStringEncodingISOLatin1 = 0x0201, kCFStringEncodingNextStepLatin = 0x0B01, kCFStringEncodingASCII = 0x0600, kCFStringEncodingUnicode = 0x0100, kCFStringEncodingUTF8 = 0x08000100, kCFStringEncodingNonLossyASCII = 0x0BFF , kCFStringEncodingUTF16 = 0x0100, kCFStringEncodingUTF16BE = 0x10000100, kCFStringEncodingUTF16LE = 0x14000100, kCFStringEncodingUTF32 = 0x0c000100, kCFStringEncodingUTF32BE = 0x18000100, kCFStringEncodingUTF32LE = 0x1c000100 }; |
| extern CFStringRef CFStringCreateWithCString(CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding); |
| |
| //===----------------------------------------------------------------------===// |
| // Test cases. |
| //===----------------------------------------------------------------------===// |
| |
| void f1() { |
| |
| // Create the array. |
| CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); |
| |
| // Create a string. |
| CFStringRef s1 = CFStringCreateWithCString(0, "hello world", |
| kCFStringEncodingUTF8); |
| |
| // Add the string to the array. |
| CFArrayAppendValue(A, s1); |
| |
| // Decrement the reference count. |
| CFRelease(s1); // no-warning |
| |
| // Get the string. We don't own it. |
| s1 = (CFStringRef) CFArrayGetValueAtIndex(A, 0); |
| |
| // Release the array. |
| CFRelease(A); // no-warning |
| |
| // Release the string. This is a bug. |
| CFRelease(s1); // expected-warning{{Incorrect decrement of the reference count}} |
| } |
| |