forked from OSchip/llvm-project
61 lines
2.9 KiB
C
61 lines
2.9 KiB
C
// 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}}
|
|
}
|
|
|