blob: ed076c680b276c216bd99bc24117dbe8b5eda69d [file] [log] [blame]
Ted Kremeneke20f9b02008-06-16 18:34:22 +00001// RUN: clang -checker-cfref -verify %s
2
3//===----------------------------------------------------------------------===//
4// The following code is reduced using delta-debugging from
5// Foundation.h (Mac OS X).
6//
7// It includes the basic definitions for the test cases below.
Ted Kremenek48e951f2008-06-16 19:51:41 +00008// Not including Foundation.h directly makes this test case both svelte and
Ted Kremeneke20f9b02008-06-16 18:34:22 +00009// portable to non-Mac platforms.
10//===----------------------------------------------------------------------===//
11
12typedef const struct __CFAllocator * CFAllocatorRef;
13typedef double CFTimeInterval;
14typedef CFTimeInterval CFAbsoluteTime;
15typedef const struct __CFDate * CFDateRef;
16extern CFDateRef CFDateCreate(CFAllocatorRef allocator, CFAbsoluteTime at);
17typedef struct objc_object {} *id;
18typedef signed char BOOL;
19typedef unsigned int NSUInteger;
20typedef struct _NSZone NSZone;
21@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
22@protocol NSObject - (BOOL)isEqual:(id)object; - (id)retain; - (oneway void)release; @end
23@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end
24@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end
25@interface NSObject <NSObject> {} @end
26extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
27typedef double NSTimeInterval;
28@interface NSDate : NSObject <NSCopying, NSCoding> - (NSTimeInterval)timeIntervalSinceReferenceDate; @end
29@class NSString, NSArray, NSTimeZone;
30
31//===----------------------------------------------------------------------===//
32// Test cases.
33//===----------------------------------------------------------------------===//
34
35CFAbsoluteTime f1() {
36 CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
37 CFDateRef date = CFDateCreate(0, t);
38 CFRetain(date);
39 CFRelease(date);
40 CFDateGetAbsoluteTime(date); // no-warning
41 CFRelease(date);
42 t = CFDateGetAbsoluteTime(date); // expected-warning{{Reference-counted object is used after it is released.}}
43 return t;
44}
45
46CFAbsoluteTime f2() {
47 CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
48 CFDateRef date = CFDateCreate(0, t);
49 [((NSDate*) date) retain];
50 CFRelease(date);
51 CFDateGetAbsoluteTime(date); // no-warning
52 [((NSDate*) date) release];
53 t = CFDateGetAbsoluteTime(date); // expected-warning{{Reference-counted object is used after it is released.}}
54 return t;
55}
56
57
58NSDate* global_x;
59
60 // Test to see if we supresss an error when we store the pointer
61 // to a global.
62
63CFAbsoluteTime f3() {
64 CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
65 CFDateRef date = CFDateCreate(0, t);
66 [((NSDate*) date) retain];
67 CFRelease(date);
68 CFDateGetAbsoluteTime(date); // no-warning
69 global_x = (NSDate*) date;
70 [((NSDate*) date) release];
71 t = CFDateGetAbsoluteTime(date); // no-warning
72 return t;
73}
74
75// Test to see if we supresss an error when we store the pointer
76// to a struct.
77
78struct foo {
79 NSDate* f;
80};
81
82CFAbsoluteTime f4() {
83 struct foo x;
84
85 CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
86 CFDateRef date = CFDateCreate(0, t);
87 [((NSDate*) date) retain];
88 CFRelease(date);
89 CFDateGetAbsoluteTime(date); // no-warning
90 x.f = (NSDate*) date;
91 [((NSDate*) date) release];
92 t = CFDateGetAbsoluteTime(date); // no-warning
93 return t;
94}
95
96// Test a leak.
97
98CFAbsoluteTime f5(int x) {
99 CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
100 CFDateRef date = CFDateCreate(0, t);
101
102 if (x)
103 CFRelease(date);
104
105 return t; // expected-warning{{leak}}
106}
107
108// Test a leak involving the return.
109
110CFDateRef f6(int x) {
111 CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent());
112 CFRetain(date);
113 return date; // expected-warning{{leak}}
114}
115
116// Test a leak involving an overwrite.
117
118CFDateRef f7() {
119 CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent());
120 CFRetain(date); //expected-warning{{leak}}
121 date = CFDateCreate(0, CFAbsoluteTimeGetCurrent());
122 return date;
123}
124
125// Generalization of Create rule. MyDateCreate returns a CFXXXTypeRef, and
126// has the word create.
127
128CFDateRef MyDateCreate();
129
130CFDateRef f8() {
131 CFDateRef date = MyDateCreate();
132 CFRetain(date);
133 return date; // expected-warning{{leak}}
134}
135
Ted Kremenek6a1cc252008-06-23 18:02:52 +0000136CFDateRef f9() {
137 CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent());
138 int *p = 0;
139 // test that the checker assumes that CFDateCreate returns a non-null
140 // pointer
141 if (!date) *p = 1; // no-warning
142 return date;
143}