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