1// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core -fblocks -analyzer-output=plist -o %t %s
2// RUN: cat %t | %diff_plist %S/Inputs/expected-plists/plist-output-alternate.m.plist -
3
4void test_null_init(void) {
5  int *p = 0;
6  *p = 0xDEADBEEF;
7}
8
9void test_null_assign(void) {
10  int *p;
11  p = 0;
12  *p = 0xDEADBEEF;
13}
14
15void test_null_assign_transitive(void) {
16  int *p;
17  p = 0;
18  int *q = p;
19  *q = 0xDEADBEEF;
20}
21
22void test_null_cond(int *p) {
23  if (!p) {
24    *p = 0xDEADBEEF;
25  }
26}
27
28void test_null_cond_transitive(int *q) {
29  if (!q) {
30    int *p = q;
31    *p = 0xDEADBEEF;
32  }
33}
34
35void test_null_field(void) {
36  struct s { int *p; } x;
37  x.p = 0;
38  *(x.p) = 0xDEADBEEF;
39}
40
41// <rdar://problem/8331641> leak reports should not show paths that end with exit() (but ones that don't end with exit())
42void panic() __attribute__((noreturn));
43enum { kCFNumberSInt8Type = 1,     kCFNumberSInt16Type = 2,     kCFNumberSInt32Type = 3,     kCFNumberSInt64Type = 4,     kCFNumberFloat32Type = 5,     kCFNumberFloat64Type = 6,      kCFNumberCharType = 7,     kCFNumberShortType = 8,     kCFNumberIntType = 9,     kCFNumberLongType = 10,     kCFNumberLongLongType = 11,     kCFNumberFloatType = 12,     kCFNumberDoubleType = 13,      kCFNumberCFIndexType = 14,      kCFNumberNSIntegerType = 15,     kCFNumberCGFloatType = 16,     kCFNumberMaxType = 16    };
44typedef const struct __CFAllocator * CFAllocatorRef;
45extern const CFAllocatorRef kCFAllocatorDefault;
46typedef signed long CFIndex;
47typedef CFIndex CFNumberType;
48typedef const struct __CFNumber * CFNumberRef;
49
50extern CFNumberRef CFNumberCreate(CFAllocatorRef allocator, CFNumberType theType, const void *valuePtr);
51
52void rdar8331641(int x) {
53  signed z = 1;
54  CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); // expected-warning{{leak}}
55  if (x)
56    panic();
57  (void) value;
58}
59
60