uninit-vals-ps.c revision be1fe1eb12a1cb91c8e3a9fcc2db4dfe989def6c
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// RUN: clang -analyze -checker-cfref -verify %s && 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// RUN: clang -analyze -checker-cfref -analyzer-store=region -verify %s 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comstruct FPRec { 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com void (*my_func)(int * x); 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com}; 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 85755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.comint bar(int x); 95755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com 105546ef2dd9edad601383b85907f677118f857332reed@google.comint f1_a(struct FPRec* foo) { 115546ef2dd9edad601383b85907f677118f857332reed@google.com int x; 120650c6ca12e026201091f3e9ea9cbf0fed2b6da1reed@android.com (*foo->my_func)(&x); 135755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com return bar(x)+1; // no-warning 145755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com} 155546ef2dd9edad601383b85907f677118f857332reed@google.com 165546ef2dd9edad601383b85907f677118f857332reed@google.comint f1_b() { 175546ef2dd9edad601383b85907f677118f857332reed@google.com int x; 185546ef2dd9edad601383b85907f677118f857332reed@google.com return bar(x)+1; // expected-warning{{Pass-by-value argument in function is undefined.}} 195546ef2dd9edad601383b85907f677118f857332reed@google.com} 205546ef2dd9edad601383b85907f677118f857332reed@google.com 215546ef2dd9edad601383b85907f677118f857332reed@google.comint f2() { 225546ef2dd9edad601383b85907f677118f857332reed@google.com 235546ef2dd9edad601383b85907f677118f857332reed@google.com int x; 245546ef2dd9edad601383b85907f677118f857332reed@google.com 255546ef2dd9edad601383b85907f677118f857332reed@google.com if (x+1) // expected-warning{{Branch}} 265546ef2dd9edad601383b85907f677118f857332reed@google.com return 1; 275546ef2dd9edad601383b85907f677118f857332reed@google.com 285546ef2dd9edad601383b85907f677118f857332reed@google.com return 2; 295546ef2dd9edad601383b85907f677118f857332reed@google.com} 305546ef2dd9edad601383b85907f677118f857332reed@google.com 315755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.comint f2_b() { 325755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com int x; 335755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com 345755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com return ((x+1)+2+((x))) + 1 ? 1 : 2; // expected-warning{{Branch}} 35d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com} 36d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com 37d41344553163085bfcfaf7d5882c6028934f8e3breed@android.comint f3(void) { 38d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com int i; 397d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com int *p = &i; 405755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com if (*p > 0) // expected-warning{{Branch condition evaluates to an uninitialized value}} 415755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com return 0; 425755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com else 437d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com return 1; 447d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com} 457d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com 467d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comint ret_uninit() { 477d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com int i; 487d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com int *p = &i; 497d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com return *p; // expected-warning{{Uninitialized or undefined return value returned to caller.}} 507d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com} 517d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com 527d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com// <rdar://problem/6451816> 537d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comtypedef unsigned char Boolean; 547d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comtypedef const struct __CFNumber * CFNumberRef; 557d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comtypedef signed long CFIndex; 565755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.comtypedef CFIndex CFNumberType; 575755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.comtypedef unsigned long UInt32; 585755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.comtypedef UInt32 CFStringEncoding; 597d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comtypedef const struct __CFString * CFStringRef; 607d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comextern Boolean CFNumberGetValue(CFNumberRef number, CFNumberType theType, void *valuePtr); 617d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comextern CFStringRef CFStringConvertEncodingToIANACharSetName(CFStringEncoding encoding); 627d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com 637d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.comCFStringRef rdar_6451816(CFNumberRef nr) { 645755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com CFStringEncoding encoding; 655755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com // &encoding is casted to void*. This test case tests whether or not 665755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com // we properly invalidate the value of 'encoding'. 675755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com CFNumberGetValue(nr, 9, &encoding); 685755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com return CFStringConvertEncodingToIANACharSetName(encoding); // no-warning 695755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com} 707d3a58a5e442e0aba239616a4e996e64866ffbd0turk@google.com 715755a2a9ab531192fd26b523960ae0c551c7b24cturk@google.com