undef-value-param.m revision 0fe4d400ab05995727440620c25fe1d185b4e046
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=text -verify %s 2// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx -analyzer-output=plist-multi-file %s -o - | FileCheck %s 3 4typedef signed char BOOL; 5@protocol NSObject - (BOOL)isEqual:(id)object; @end 6@interface NSObject <NSObject> {} 7+(id)alloc; 8+(id)new; 9-(id)init; 10-(id)autorelease; 11-(id)copy; 12- (Class)class; 13-(id)retain; 14@end 15typedef const void * CFTypeRef; 16extern void CFRelease(CFTypeRef cf); 17 18@interface Cell : NSObject 19- (void)test; 20@end 21 22@interface SpecialString 23+ (id)alloc; 24- (oneway void)release; 25@end 26 27typedef SpecialString* SCDynamicStoreRef; 28static void CreateRef(SCDynamicStoreRef *storeRef, unsigned x); 29SCDynamicStoreRef anotherCreateRef(unsigned *err, unsigned x); 30 31@implementation Cell 32- (void) test { 33 SCDynamicStoreRef storeRef = 0; //expected-note{{Variable 'storeRef' initialized to nil}} 34 CreateRef(&storeRef, 4); 35 //expected-note@-1{{Calling 'CreateRef'}} 36 //expected-note@-2{{Returning from 'CreateRef'}} 37 CFRelease(storeRef); //expected-warning {{Null pointer argument in call to CFRelease}} 38 //expected-note@-1{{Null pointer argument in call to CFRelease}} 39} 40@end 41 42static void CreateRef(SCDynamicStoreRef *storeRef, unsigned x) { 43 unsigned err = 0; 44 SCDynamicStoreRef ref = anotherCreateRef(&err, x); // why this is being inlined? 45 if (err) { 46 //expected-note@-1{{Assuming 'err' is not equal to 0}} 47 //expected-note@-2{{Taking true branch}} 48 CFRelease(ref); 49 ref = 0; 50 } 51 *storeRef = ref; 52} 53 54//CHECK: <dict> 55//CHECK: <key>files</key> 56//CHECK: <array> 57//CHECK: </array> 58//CHECK: <key>diagnostics</key> 59//CHECK: <array> 60//CHECK: <dict> 61//CHECK: <key>path</key> 62//CHECK: <array> 63//CHECK: <dict> 64//CHECK: <key>kind</key><string>event</string> 65//CHECK: <key>location</key> 66//CHECK: <dict> 67//CHECK: <key>line</key><integer>33</integer> 68//CHECK: <key>col</key><integer>5</integer> 69//CHECK: <key>file</key><integer>0</integer> 70//CHECK: </dict> 71//CHECK: <key>ranges</key> 72//CHECK: <array> 73//CHECK: <array> 74//CHECK: <dict> 75//CHECK: <key>line</key><integer>33</integer> 76//CHECK: <key>col</key><integer>5</integer> 77//CHECK: <key>file</key><integer>0</integer> 78//CHECK: </dict> 79//CHECK: <dict> 80//CHECK: <key>line</key><integer>33</integer> 81//CHECK: <key>col</key><integer>30</integer> 82//CHECK: <key>file</key><integer>0</integer> 83//CHECK: </dict> 84//CHECK: </array> 85//CHECK: </array> 86//CHECK: <key>depth</key><integer>0</integer> 87//CHECK: <key>extended_message</key> 88//CHECK: <string>Variable 'storeRef' initialized to nil</string> 89//CHECK: <key>message</key> 90//CHECK: <string>Variable 'storeRef' initialized to nil</string> 91//CHECK: </dict> 92//CHECK: <dict> 93//CHECK: <key>kind</key><string>control</string> 94//CHECK: <key>edges</key> 95//CHECK: <array> 96//CHECK: <dict> 97//CHECK: <key>start</key> 98//CHECK: <array> 99//CHECK: <dict> 100//CHECK: <key>line</key><integer>33</integer> 101//CHECK: <key>col</key><integer>5</integer> 102//CHECK: <key>file</key><integer>0</integer> 103//CHECK: </dict> 104//CHECK: <dict> 105//CHECK: <key>line</key><integer>33</integer> 106//CHECK: <key>col</key><integer>21</integer> 107//CHECK: <key>file</key><integer>0</integer> 108//CHECK: </dict> 109//CHECK: </array> 110//CHECK: <key>end</key> 111//CHECK: <array> 112//CHECK: <dict> 113//CHECK: <key>line</key><integer>34</integer> 114//CHECK: <key>col</key><integer>5</integer> 115//CHECK: <key>file</key><integer>0</integer> 116//CHECK: </dict> 117//CHECK: <dict> 118//CHECK: <key>line</key><integer>34</integer> 119//CHECK: <key>col</key><integer>13</integer> 120//CHECK: <key>file</key><integer>0</integer> 121//CHECK: </dict> 122//CHECK: </array> 123//CHECK: </dict> 124//CHECK: </array> 125//CHECK: </dict> 126//CHECK: <dict> 127//CHECK: <key>kind</key><string>event</string> 128//CHECK: <key>location</key> 129//CHECK: <dict> 130//CHECK: <key>line</key><integer>34</integer> 131//CHECK: <key>col</key><integer>5</integer> 132//CHECK: <key>file</key><integer>0</integer> 133//CHECK: </dict> 134//CHECK: <key>ranges</key> 135//CHECK: <array> 136//CHECK: <array> 137//CHECK: <dict> 138//CHECK: <key>line</key><integer>34</integer> 139//CHECK: <key>col</key><integer>5</integer> 140//CHECK: <key>file</key><integer>0</integer> 141//CHECK: </dict> 142//CHECK: <dict> 143//CHECK: <key>line</key><integer>34</integer> 144//CHECK: <key>col</key><integer>27</integer> 145//CHECK: <key>file</key><integer>0</integer> 146//CHECK: </dict> 147//CHECK: </array> 148//CHECK: </array> 149//CHECK: <key>depth</key><integer>0</integer> 150//CHECK: <key>extended_message</key> 151//CHECK: <string>Calling 'CreateRef'</string> 152//CHECK: <key>message</key> 153//CHECK: <string>Calling 'CreateRef'</string> 154//CHECK: </dict> 155//CHECK: <dict> 156//CHECK: <key>kind</key><string>event</string> 157//CHECK: <key>location</key> 158//CHECK: <dict> 159//CHECK: <key>line</key><integer>42</integer> 160//CHECK: <key>col</key><integer>1</integer> 161//CHECK: <key>file</key><integer>0</integer> 162//CHECK: </dict> 163//CHECK: <key>depth</key><integer>1</integer> 164//CHECK: <key>extended_message</key> 165//CHECK: <string>Entered call from 'test'</string> 166//CHECK: <key>message</key> 167//CHECK: <string>Entered call from 'test'</string> 168//CHECK: </dict> 169//CHECK: <dict> 170//CHECK: <key>kind</key><string>control</string> 171//CHECK: <key>edges</key> 172//CHECK: <array> 173//CHECK: <dict> 174//CHECK: <key>start</key> 175//CHECK: <array> 176//CHECK: <dict> 177//CHECK: <key>line</key><integer>42</integer> 178//CHECK: <key>col</key><integer>1</integer> 179//CHECK: <key>file</key><integer>0</integer> 180//CHECK: </dict> 181//CHECK: <dict> 182//CHECK: <key>line</key><integer>42</integer> 183//CHECK: <key>col</key><integer>6</integer> 184//CHECK: <key>file</key><integer>0</integer> 185//CHECK: </dict> 186//CHECK: </array> 187//CHECK: <key>end</key> 188//CHECK: <array> 189//CHECK: <dict> 190//CHECK: <key>line</key><integer>43</integer> 191//CHECK: <key>col</key><integer>5</integer> 192//CHECK: <key>file</key><integer>0</integer> 193//CHECK: </dict> 194//CHECK: <dict> 195//CHECK: <key>line</key><integer>43</integer> 196//CHECK: <key>col</key><integer>12</integer> 197//CHECK: <key>file</key><integer>0</integer> 198//CHECK: </dict> 199//CHECK: </array> 200//CHECK: </dict> 201//CHECK: </array> 202//CHECK: </dict> 203//CHECK: <dict> 204//CHECK: <key>kind</key><string>control</string> 205//CHECK: <key>edges</key> 206//CHECK: <array> 207//CHECK: <dict> 208//CHECK: <key>start</key> 209//CHECK: <array> 210//CHECK: <dict> 211//CHECK: <key>line</key><integer>43</integer> 212//CHECK: <key>col</key><integer>5</integer> 213//CHECK: <key>file</key><integer>0</integer> 214//CHECK: </dict> 215//CHECK: <dict> 216//CHECK: <key>line</key><integer>43</integer> 217//CHECK: <key>col</key><integer>12</integer> 218//CHECK: <key>file</key><integer>0</integer> 219//CHECK: </dict> 220//CHECK: </array> 221//CHECK: <key>end</key> 222//CHECK: <array> 223//CHECK: <dict> 224//CHECK: <key>line</key><integer>45</integer> 225//CHECK: <key>col</key><integer>5</integer> 226//CHECK: <key>file</key><integer>0</integer> 227//CHECK: </dict> 228//CHECK: <dict> 229//CHECK: <key>line</key><integer>45</integer> 230//CHECK: <key>col</key><integer>6</integer> 231//CHECK: <key>file</key><integer>0</integer> 232//CHECK: </dict> 233//CHECK: </array> 234//CHECK: </dict> 235//CHECK: </array> 236//CHECK: </dict> 237//CHECK: <dict> 238//CHECK: <key>kind</key><string>control</string> 239//CHECK: <key>edges</key> 240//CHECK: <array> 241//CHECK: <dict> 242//CHECK: <key>start</key> 243//CHECK: <array> 244//CHECK: <dict> 245//CHECK: <key>line</key><integer>45</integer> 246//CHECK: <key>col</key><integer>5</integer> 247//CHECK: <key>file</key><integer>0</integer> 248//CHECK: </dict> 249//CHECK: <dict> 250//CHECK: <key>line</key><integer>45</integer> 251//CHECK: <key>col</key><integer>6</integer> 252//CHECK: <key>file</key><integer>0</integer> 253//CHECK: </dict> 254//CHECK: </array> 255//CHECK: <key>end</key> 256//CHECK: <array> 257//CHECK: <dict> 258//CHECK: <key>line</key><integer>45</integer> 259//CHECK: <key>col</key><integer>9</integer> 260//CHECK: <key>file</key><integer>0</integer> 261//CHECK: </dict> 262//CHECK: <dict> 263//CHECK: <key>line</key><integer>45</integer> 264//CHECK: <key>col</key><integer>11</integer> 265//CHECK: <key>file</key><integer>0</integer> 266//CHECK: </dict> 267//CHECK: </array> 268//CHECK: </dict> 269//CHECK: </array> 270//CHECK: </dict> 271//CHECK: <dict> 272//CHECK: <key>kind</key><string>event</string> 273//CHECK: <key>location</key> 274//CHECK: <dict> 275//CHECK: <key>line</key><integer>45</integer> 276//CHECK: <key>col</key><integer>9</integer> 277//CHECK: <key>file</key><integer>0</integer> 278//CHECK: </dict> 279//CHECK: <key>ranges</key> 280//CHECK: <array> 281//CHECK: <array> 282//CHECK: <dict> 283//CHECK: <key>line</key><integer>45</integer> 284//CHECK: <key>col</key><integer>9</integer> 285//CHECK: <key>file</key><integer>0</integer> 286//CHECK: </dict> 287//CHECK: <dict> 288//CHECK: <key>line</key><integer>45</integer> 289//CHECK: <key>col</key><integer>11</integer> 290//CHECK: <key>file</key><integer>0</integer> 291//CHECK: </dict> 292//CHECK: </array> 293//CHECK: </array> 294//CHECK: <key>depth</key><integer>1</integer> 295//CHECK: <key>extended_message</key> 296//CHECK: <string>Assuming 'err' is not equal to 0</string> 297//CHECK: <key>message</key> 298//CHECK: <string>Assuming 'err' is not equal to 0</string> 299//CHECK: </dict> 300//CHECK: <dict> 301//CHECK: <key>kind</key><string>control</string> 302//CHECK: <key>edges</key> 303//CHECK: <array> 304//CHECK: <dict> 305//CHECK: <key>start</key> 306//CHECK: <array> 307//CHECK: <dict> 308//CHECK: <key>line</key><integer>45</integer> 309//CHECK: <key>col</key><integer>9</integer> 310//CHECK: <key>file</key><integer>0</integer> 311//CHECK: </dict> 312//CHECK: <dict> 313//CHECK: <key>line</key><integer>45</integer> 314//CHECK: <key>col</key><integer>11</integer> 315//CHECK: <key>file</key><integer>0</integer> 316//CHECK: </dict> 317//CHECK: </array> 318//CHECK: <key>end</key> 319//CHECK: <array> 320//CHECK: <dict> 321//CHECK: <key>line</key><integer>48</integer> 322//CHECK: <key>col</key><integer>9</integer> 323//CHECK: <key>file</key><integer>0</integer> 324//CHECK: </dict> 325//CHECK: <dict> 326//CHECK: <key>line</key><integer>48</integer> 327//CHECK: <key>col</key><integer>17</integer> 328//CHECK: <key>file</key><integer>0</integer> 329//CHECK: </dict> 330//CHECK: </array> 331//CHECK: </dict> 332//CHECK: </array> 333//CHECK: </dict> 334//CHECK: <dict> 335//CHECK: <key>kind</key><string>control</string> 336//CHECK: <key>edges</key> 337//CHECK: <array> 338//CHECK: <dict> 339//CHECK: <key>start</key> 340//CHECK: <array> 341//CHECK: <dict> 342//CHECK: <key>line</key><integer>48</integer> 343//CHECK: <key>col</key><integer>9</integer> 344//CHECK: <key>file</key><integer>0</integer> 345//CHECK: </dict> 346//CHECK: <dict> 347//CHECK: <key>line</key><integer>48</integer> 348//CHECK: <key>col</key><integer>17</integer> 349//CHECK: <key>file</key><integer>0</integer> 350//CHECK: </dict> 351//CHECK: </array> 352//CHECK: <key>end</key> 353//CHECK: <array> 354//CHECK: <dict> 355//CHECK: <key>line</key><integer>51</integer> 356//CHECK: <key>col</key><integer>5</integer> 357//CHECK: <key>file</key><integer>0</integer> 358//CHECK: </dict> 359//CHECK: <dict> 360//CHECK: <key>line</key><integer>51</integer> 361//CHECK: <key>col</key><integer>5</integer> 362//CHECK: <key>file</key><integer>0</integer> 363//CHECK: </dict> 364//CHECK: </array> 365//CHECK: </dict> 366//CHECK: </array> 367//CHECK: </dict> 368//CHECK: <dict> 369//CHECK: <key>kind</key><string>event</string> 370//CHECK: <key>location</key> 371//CHECK: <dict> 372//CHECK: <key>line</key><integer>34</integer> 373//CHECK: <key>col</key><integer>5</integer> 374//CHECK: <key>file</key><integer>0</integer> 375//CHECK: </dict> 376//CHECK: <key>ranges</key> 377//CHECK: <array> 378//CHECK: <array> 379//CHECK: <dict> 380//CHECK: <key>line</key><integer>34</integer> 381//CHECK: <key>col</key><integer>5</integer> 382//CHECK: <key>file</key><integer>0</integer> 383//CHECK: </dict> 384//CHECK: <dict> 385//CHECK: <key>line</key><integer>34</integer> 386//CHECK: <key>col</key><integer>27</integer> 387//CHECK: <key>file</key><integer>0</integer> 388//CHECK: </dict> 389//CHECK: </array> 390//CHECK: </array> 391//CHECK: <key>depth</key><integer>1</integer> 392//CHECK: <key>extended_message</key> 393//CHECK: <string>Returning from 'CreateRef'</string> 394//CHECK: <key>message</key> 395//CHECK: <string>Returning from 'CreateRef'</string> 396//CHECK: </dict> 397//CHECK: <dict> 398//CHECK: <key>kind</key><string>control</string> 399//CHECK: <key>edges</key> 400//CHECK: <array> 401//CHECK: <dict> 402//CHECK: <key>start</key> 403//CHECK: <array> 404//CHECK: <dict> 405//CHECK: <key>line</key><integer>34</integer> 406//CHECK: <key>col</key><integer>5</integer> 407//CHECK: <key>file</key><integer>0</integer> 408//CHECK: </dict> 409//CHECK: <dict> 410//CHECK: <key>line</key><integer>34</integer> 411//CHECK: <key>col</key><integer>13</integer> 412//CHECK: <key>file</key><integer>0</integer> 413//CHECK: </dict> 414//CHECK: </array> 415//CHECK: <key>end</key> 416//CHECK: <array> 417//CHECK: <dict> 418//CHECK: <key>line</key><integer>37</integer> 419//CHECK: <key>col</key><integer>5</integer> 420//CHECK: <key>file</key><integer>0</integer> 421//CHECK: </dict> 422//CHECK: <dict> 423//CHECK: <key>line</key><integer>37</integer> 424//CHECK: <key>col</key><integer>13</integer> 425//CHECK: <key>file</key><integer>0</integer> 426//CHECK: </dict> 427//CHECK: </array> 428//CHECK: </dict> 429//CHECK: </array> 430//CHECK: </dict> 431//CHECK: <dict> 432//CHECK: <key>kind</key><string>event</string> 433//CHECK: <key>location</key> 434//CHECK: <dict> 435//CHECK: <key>line</key><integer>37</integer> 436//CHECK: <key>col</key><integer>5</integer> 437//CHECK: <key>file</key><integer>0</integer> 438//CHECK: </dict> 439//CHECK: <key>ranges</key> 440//CHECK: <array> 441//CHECK: <array> 442//CHECK: <dict> 443//CHECK: <key>line</key><integer>37</integer> 444//CHECK: <key>col</key><integer>15</integer> 445//CHECK: <key>file</key><integer>0</integer> 446//CHECK: </dict> 447//CHECK: <dict> 448//CHECK: <key>line</key><integer>37</integer> 449//CHECK: <key>col</key><integer>22</integer> 450//CHECK: <key>file</key><integer>0</integer> 451//CHECK: </dict> 452//CHECK: </array> 453//CHECK: </array> 454//CHECK: <key>depth</key><integer>0</integer> 455//CHECK: <key>extended_message</key> 456//CHECK: <string>Null pointer argument in call to CFRelease</string> 457//CHECK: <key>message</key> 458//CHECK: <string>Null pointer argument in call to CFRelease</string> 459//CHECK: </dict> 460//CHECK: </array> 461//CHECK: <key>description</key><string>Null pointer argument in call to CFRelease</string> 462//CHECK: <key>category</key><string>API Misuse (Apple)</string> 463//CHECK: <key>type</key><string>null passed to CFRetain/CFRelease/CFMakeCollectable</string> 464//CHECK: <key>issue_context_kind</key><string>Objective-C method</string> 465//CHECK: <key>issue_context</key><string>test</string> 466//CHECK: <key>issue_hash</key><integer>5</integer> 467//CHECK: <key>location</key> 468//CHECK: <dict> 469//CHECK: <key>line</key><integer>37</integer> 470//CHECK: <key>col</key><integer>5</integer> 471//CHECK: <key>file</key><integer>0</integer> 472//CHECK: </dict> 473//CHECK: </dict> 474//CHECK: </array> 475//CHECK: </dict> 476//CHECK: </plist> 477