// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=text -verify %s // RUN: %clang_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=plist-multi-file %s -o - | FileCheck %s typedef signed char BOOL; @protocol NSObject - (BOOL)isEqual:(id)object; @end @interface NSObject {} +(id)alloc; +(id)new; -(id)init; -(id)autorelease; -(id)copy; - (Class)class; -(id)retain; @end typedef const void * CFTypeRef; extern void CFRelease(CFTypeRef cf); @interface Cell : NSObject - (void)test; @end @interface SpecialString + (id)alloc; - (oneway void)release; @end typedef SpecialString* SCDynamicStoreRef; static void CreateRef(SCDynamicStoreRef *storeRef, unsigned x); SCDynamicStoreRef anotherCreateRef(unsigned *err, unsigned x); @implementation Cell - (void) test { SCDynamicStoreRef storeRef = 0; //expected-note{{Variable 'storeRef' initialized to nil}} CreateRef(&storeRef, 4); //expected-note@-1{{Calling 'CreateRef'}} //expected-note@-2{{Returning from 'CreateRef'}} CFRelease(storeRef); //expected-warning {{Null pointer argument in call to CFRelease}} //expected-note@-1{{Null pointer argument in call to CFRelease}} } @end static void CreateRef(SCDynamicStoreRef *storeRef, unsigned x) { unsigned err = 0; SCDynamicStoreRef ref = anotherCreateRef(&err, x); // why this is being inlined? if (err) { //expected-note@-1{{Assuming 'err' is not equal to 0}} //expected-note@-2{{Taking true branch}} CFRelease(ref); ref = 0; } *storeRef = ref; } //CHECK: //CHECK: files //CHECK: //CHECK: //CHECK: diagnostics //CHECK: //CHECK: //CHECK: path //CHECK: //CHECK: //CHECK: kindevent //CHECK: location //CHECK: //CHECK: line33 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: ranges //CHECK: //CHECK: //CHECK: //CHECK: line33 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line33 //CHECK: col30 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: depth0 //CHECK: extended_message //CHECK: Variable 'storeRef' initialized to nil //CHECK: message //CHECK: Variable 'storeRef' initialized to nil //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line33 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line33 //CHECK: col21 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line34 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line34 //CHECK: col13 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindevent //CHECK: location //CHECK: //CHECK: line34 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: ranges //CHECK: //CHECK: //CHECK: //CHECK: line34 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line34 //CHECK: col27 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: depth0 //CHECK: extended_message //CHECK: Calling 'CreateRef' //CHECK: message //CHECK: Calling 'CreateRef' //CHECK: //CHECK: //CHECK: kindevent //CHECK: location //CHECK: //CHECK: line42 //CHECK: col1 //CHECK: file0 //CHECK: //CHECK: depth1 //CHECK: extended_message //CHECK: Entered call from 'test' //CHECK: message //CHECK: Entered call from 'test' //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line42 //CHECK: col1 //CHECK: file0 //CHECK: //CHECK: //CHECK: line42 //CHECK: col6 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line43 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line43 //CHECK: col12 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line43 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line43 //CHECK: col12 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line45 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line45 //CHECK: col6 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line45 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line45 //CHECK: col6 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line45 //CHECK: col9 //CHECK: file0 //CHECK: //CHECK: //CHECK: line45 //CHECK: col11 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindevent //CHECK: location //CHECK: //CHECK: line45 //CHECK: col9 //CHECK: file0 //CHECK: //CHECK: ranges //CHECK: //CHECK: //CHECK: //CHECK: line45 //CHECK: col9 //CHECK: file0 //CHECK: //CHECK: //CHECK: line45 //CHECK: col11 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: depth1 //CHECK: extended_message //CHECK: Assuming 'err' is not equal to 0 //CHECK: message //CHECK: Assuming 'err' is not equal to 0 //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line45 //CHECK: col9 //CHECK: file0 //CHECK: //CHECK: //CHECK: line45 //CHECK: col11 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line48 //CHECK: col9 //CHECK: file0 //CHECK: //CHECK: //CHECK: line48 //CHECK: col17 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line48 //CHECK: col9 //CHECK: file0 //CHECK: //CHECK: //CHECK: line48 //CHECK: col17 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line51 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line51 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindevent //CHECK: location //CHECK: //CHECK: line34 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: ranges //CHECK: //CHECK: //CHECK: //CHECK: line34 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line34 //CHECK: col27 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: depth1 //CHECK: extended_message //CHECK: Returning from 'CreateRef' //CHECK: message //CHECK: Returning from 'CreateRef' //CHECK: //CHECK: //CHECK: kindcontrol //CHECK: edges //CHECK: //CHECK: //CHECK: start //CHECK: //CHECK: //CHECK: line34 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line34 //CHECK: col13 //CHECK: file0 //CHECK: //CHECK: //CHECK: end //CHECK: //CHECK: //CHECK: line37 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: line37 //CHECK: col13 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: kindevent //CHECK: location //CHECK: //CHECK: line37 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: ranges //CHECK: //CHECK: //CHECK: //CHECK: line37 //CHECK: col15 //CHECK: file0 //CHECK: //CHECK: //CHECK: line37 //CHECK: col22 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: depth0 //CHECK: extended_message //CHECK: Null pointer argument in call to CFRelease //CHECK: message //CHECK: Null pointer argument in call to CFRelease //CHECK: //CHECK: //CHECK: descriptionNull pointer argument in call to CFRelease //CHECK: categoryAPI Misuse (Apple) //CHECK: typenull passed to CFRetain/CFRelease/CFMakeCollectable //CHECK: issue_context_kindObjective-C method //CHECK: issue_contexttest //CHECK: issue_hash5 //CHECK: location //CHECK: //CHECK: line37 //CHECK: col5 //CHECK: file0 //CHECK: //CHECK: //CHECK: //CHECK: //CHECK: