// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-output=plist -o %t %s // RUN: FileCheck --input-file %t %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: files // CHECK: // CHECK: // CHECK: diagnostics // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line5 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line5 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line6 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line6 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line6 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line6 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line6 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // 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: issue_context_kindfunction // CHECK: issue_contexttest_null_init // CHECK: location // CHECK: // CHECK: line6 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // 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: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line12 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // 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: issue_context_kindfunction // CHECK: issue_contexttest_null_assign // CHECK: location // CHECK: // CHECK: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line16 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line16 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line19 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line19 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // 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: issue_context_kindfunction // CHECK: issue_contexttest_null_assign_transitive // CHECK: location // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line23 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line23 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line23 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Assuming 'p' is null // CHECK: message // CHECK: Assuming 'p' is null // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line23 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line24 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line24 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line24 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line24 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: line24 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // 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: issue_context_kindfunction // CHECK: issue_contexttest_null_cond // CHECK: location // CHECK: // CHECK: line24 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line29 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line29 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line29 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line30 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line31 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line31 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line31 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line31 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: line31 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // 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: issue_context_kindfunction // CHECK: issue_contexttest_null_cond_transitive // CHECK: location // CHECK: // CHECK: line31 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line36 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line36 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line38 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line38 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line38 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line38 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line38 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // 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: issue_context_kindfunction // CHECK: issue_contexttest_null_field // CHECK: location // CHECK: // CHECK: line38 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // 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: 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: line54 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: // CHECK: line54 // CHECK: col82 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line54 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line54 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: // CHECK: line54 // CHECK: col82 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count // CHECK: message // CHECK: Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line54 // CHECK: col23 // CHECK: file0 // CHECK: // CHECK: // CHECK: line54 // CHECK: col82 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line55 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line55 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line55 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line55 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line55 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line57 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: line57 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line57 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: line57 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line58 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: line58 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line58 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Object leaked: object allocated and stored into 'value' is not referenced later in this execution path and has a retain count of +1 // CHECK: message // CHECK: Object leaked: object allocated and stored into 'value' is not referenced later in this execution path and has a retain count of +1 // CHECK: // CHECK: // CHECK: descriptionPotential leak of an object stored into 'value' // CHECK: categoryMemory (Core Foundation/Objective-C) // CHECK: typeLeak // CHECK: issue_context_kindfunction // CHECK: issue_contextrdar8331641 // CHECK: location // CHECK: // CHECK: line58 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: