// RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-output=plist -o - %s | FileCheck %s void test_null_init(void) { int *p = 0; *p = 0xDEADBEEF; } void test_null_assign(void) { int *p; p = 0; *p = 0xDEADBEEF; } void test_null_assign_transitive(void) { int *p; p = 0; int *q = p; *q = 0xDEADBEEF; } void test_null_cond(int *p) { if (!p) { *p = 0xDEADBEEF; } } void test_null_cond_transitive(int *q) { if (!q) { int *p = q; *p = 0xDEADBEEF; } } void test_null_field(void) { struct s { int *p; } x; x.p = 0; *(x.p) = 0xDEADBEEF; } // leak reports should not show paths that end with exit() (but ones that don't end with exit()) void panic() __attribute__((noreturn)); enum { 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 }; typedef const struct __CFAllocator * CFAllocatorRef; extern const CFAllocatorRef kCFAllocatorDefault; typedef signed long CFIndex; typedef CFIndex CFNumberType; typedef const struct __CFNumber * CFNumberRef; extern CFNumberRef CFNumberCreate(CFAllocatorRef allocator, CFNumberType theType, const void *valuePtr); void rdar8331641(int x) { signed z = 1; CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); // expected-warning{{leak}} if (x) panic(); (void) value; } // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: files // CHECK: // CHECK: // CHECK: diagnostics // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line4 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line4 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line4 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line4 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line4 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line5 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line5 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line5 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line5 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line5 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line5 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line9 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line9 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line10 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line10 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line10 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line10 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line10 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Null pointer value stored to 'p' // CHECK: message // CHECK: Null pointer value stored to 'p' // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line10 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line10 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line11 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line11 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line11 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line11 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line11 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line11 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line15 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line15 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line17 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line17 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Variable 'q' initialized to a null pointer value // CHECK: message // CHECK: Variable 'q' initialized to a null pointer value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line17 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line18 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line18 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line18 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'q') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'q') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'q') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line22 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line22 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line23 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line23 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line23 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line23 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line28 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line28 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line30 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line30 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: line30 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line35 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line35 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line35 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: line35 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line35 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: line35 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line37 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line37 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from field 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from field 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from field 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line37 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line52 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line52 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line53 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line53 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line53 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line53 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line53 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: // CHECK: line53 // CHECK: col82 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line53 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line53 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: // CHECK: line53 // CHECK: col82 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count (owning reference) // CHECK: message // CHECK: Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count (owning reference) // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line53 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: // CHECK: line53 // CHECK: col82 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line54 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line54 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line54 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line54 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line57 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: line57 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line57 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line57 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: line57 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: extended_message // CHECK: Object allocated on line 53 and stored into 'value' is not referenced later in this execution path and has a retain count of +1 (object leaked) // CHECK: message // CHECK: Object allocated on line 53 and stored into 'value' is not referenced later in this execution path and has a retain count of +1 (object leaked) // CHECK: // CHECK: // CHECK: descriptionPotential leak of an object allocated on line 53 and stored into 'value' // CHECK: categoryMemory (Core Foundation/Objective-C) // CHECK: typeLeak of returned object // CHECK: location // CHECK: // CHECK: line57 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: