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