1898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -fblocks -verify %s
243ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek
343ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenekstruct FPRec {
443ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek  void (*my_func)(int * x);
543ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek};
643ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek
743ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenekint bar(int x);
843ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek
943ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenekint f1_a(struct FPRec* foo) {
1043ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek  int x;
1143ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek  (*foo->my_func)(&x);
1243ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek  return bar(x)+1; // no-warning
1343ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek}
1443ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek
1543ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenekint f1_b() {
1643ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek  int x;
17818b433a943653b329df56bdaa1b18385603d2bdTed Kremenek  return bar(x)+1;  // expected-warning{{Function call argument is an uninitialized value}}
1843ae4b0d2ba2a7de1c3ccb25f22955489999e1fbTed Kremenek}
195c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
205c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenekint f2() {
215c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
225c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek  int x;
235c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
24112ba7e57e23c2310479fd6bb116d9570fc2b77dTed Kremenek  if (x+1)  // expected-warning{{The left operand of '+' is a garbage value}}
255c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek    return 1;
265c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
275c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek  return 2;
285c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek}
295c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
305c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenekint f2_b() {
315c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek  int x;
325c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
33112ba7e57e23c2310479fd6bb116d9570fc2b77dTed Kremenek  return ((1+x)+2+((x))) + 1 ? 1 : 2; // expected-warning{{The right operand of '+' is a garbage value}}
345c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek}
355c454ab13ac53b824209a16ec199135f084ddc8bTed Kremenek
365c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenekint f3(void) {
375c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenek  int i;
385c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenek  int *p = &i;
39112ba7e57e23c2310479fd6bb116d9570fc2b77dTed Kremenek  if (*p > 0) // expected-warning{{The left operand of '>' is a garbage value}}
405c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenek    return 0;
415c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenek  else
425c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenek    return 1;
435c96c27e7f35e49a36c6ffdc55cdd5de0230f7afTed Kremenek}
4489e8a07af3e24ae0f843b80906422d711f73de0aZhongxing Xu
45ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenekvoid f4_aux(float* x);
46ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenekfloat f4(void) {
47ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek  float x;
48ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek  f4_aux(&x);
49ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek  return x;  // no-warning
50ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek}
51ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek
52ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenekstruct f5_struct { int x; };
53ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenekvoid f5_aux(struct f5_struct* s);
54ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenekint f5(void) {
55ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek  struct f5_struct s;
56ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek  f5_aux(&s);
57ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek  return s.x; // no-warning
58ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek}
59ef77d54a493a18d8e2dae772230987e5c01bfb04Ted Kremenek
607c686661d65c63f6f518ca81830dd61bd64bfe1fTed Kremenekint ret_uninit() {
617c686661d65c63f6f518ca81830dd61bd64bfe1fTed Kremenek  int i;
627c686661d65c63f6f518ca81830dd61bd64bfe1fTed Kremenek  int *p = &i;
635b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek  return *p;  // expected-warning{{Undefined or garbage value returned to caller}}
647c686661d65c63f6f518ca81830dd61bd64bfe1fTed Kremenek}
657c686661d65c63f6f518ca81830dd61bd64bfe1fTed Kremenek
6690b3236cbea10044c38ea40585dce8150236f1caTed Kremenek// <rdar://problem/6451816>
6790b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef unsigned char Boolean;
6890b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef const struct __CFNumber * CFNumberRef;
6990b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef signed long CFIndex;
7090b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef CFIndex CFNumberType;
7190b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef unsigned long UInt32;
7290b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef UInt32 CFStringEncoding;
7390b3236cbea10044c38ea40585dce8150236f1caTed Kremenektypedef const struct __CFString * CFStringRef;
7490b3236cbea10044c38ea40585dce8150236f1caTed Kremenekextern Boolean CFNumberGetValue(CFNumberRef number, CFNumberType theType, void *valuePtr);
7590b3236cbea10044c38ea40585dce8150236f1caTed Kremenekextern CFStringRef CFStringConvertEncodingToIANACharSetName(CFStringEncoding encoding);
7690b3236cbea10044c38ea40585dce8150236f1caTed Kremenek
7790b3236cbea10044c38ea40585dce8150236f1caTed KremenekCFStringRef rdar_6451816(CFNumberRef nr) {
7890b3236cbea10044c38ea40585dce8150236f1caTed Kremenek  CFStringEncoding encoding;
7990b3236cbea10044c38ea40585dce8150236f1caTed Kremenek  // &encoding is casted to void*.  This test case tests whether or not
8090b3236cbea10044c38ea40585dce8150236f1caTed Kremenek  // we properly invalidate the value of 'encoding'.
8190b3236cbea10044c38ea40585dce8150236f1caTed Kremenek  CFNumberGetValue(nr, 9, &encoding);
8290b3236cbea10044c38ea40585dce8150236f1caTed Kremenek  return CFStringConvertEncodingToIANACharSetName(encoding); // no-warning
8390b3236cbea10044c38ea40585dce8150236f1caTed Kremenek}
847c686661d65c63f6f518ca81830dd61bd64bfe1fTed Kremenek
85bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek// PR 4630 - false warning with nonnull attribute
86bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek//  This false positive (due to a regression) caused the analyzer to falsely
87bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek//  flag a "return of uninitialized value" warning in the first branch due to
88bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek//  the nonnull attribute.
89bb977228e642e0d12365862a3838dd5005ef783bTed Kremenekvoid pr_4630_aux(char *x, int *y) __attribute__ ((nonnull (1)));
90bb977228e642e0d12365862a3838dd5005ef783bTed Kremenekvoid pr_4630_aux_2(char *x, int *y);
91bb977228e642e0d12365862a3838dd5005ef783bTed Kremenekint pr_4630(char *a, int y) {
92bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek  int x;
93bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek  if (y) {
94bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek    pr_4630_aux(a, &x);
95bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek    return x;   // no-warning
96bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek  }
97bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek  else {
98bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek    pr_4630_aux_2(a, &x);
99bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek    return x;   // no-warning
100bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek  }
101bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek}
102bb977228e642e0d12365862a3838dd5005ef783bTed Kremenek
103f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek// PR 4631 - False positive with union initializer
104f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek//  Previously the analyzer didn't examine the compound initializers of unions,
105f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek//  resulting in some false positives for initializers with side-effects.
106f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenekunion u_4631 { int a; };
107f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenekstruct s_4631 { int a; };
108f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenekint pr4631_f2(int *p);
109f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenekint pr4631_f3(void *q);
110f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenekint pr4631_f1(void)
111f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek{
112f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  int x;
113f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  union u_4631 m = { pr4631_f2(&x) };
114f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  pr4631_f3(&m); // tell analyzer that we use m
115f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  return x;  // no-warning
116f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek}
117f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenekint pr4631_f1_b(void)
118f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek{
119f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  int x;
120f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  struct s_4631 m = { pr4631_f2(&x) };
121f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  pr4631_f3(&m); // tell analyzer that we use m
122f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek  return x;  // no-warning
123f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek}
124f3bfa21565b8145afe9b4886770257e890b0b68dTed Kremenek
125898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose// <rdar://problem/12278788> - FP when returning a void-valued expression from
126898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose// a void function...or block.
12716e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaksvoid foo_radar12278788() { return; }
12816e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaksvoid test_radar12278788() {
12916e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  return foo_radar12278788(); // no-warning
13016e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks}
13116e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks
13216e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaksvoid foo_radar12278788_fp() { return; }
13316e6a7cb41319459ded69b4d47f405c1035dd347Anna Zakstypedef int (*RetIntFuncType)();
13416e6a7cb41319459ded69b4d47f405c1035dd347Anna Zakstypedef void (*RetVoidFuncType)();
13516e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaksint test_radar12278788_FP() {
13616e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  RetVoidFuncType f = foo_radar12278788_fp;
13716e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  return ((RetIntFuncType)f)(); //expected-warning {{Undefined or garbage value returned to caller}}
13816e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks}
139898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose
140898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rosevoid rdar13665798() {
141898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  ^() {
142898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    return foo_radar12278788(); // no-warning
143898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  }();
144898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  ^void() {
145898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    return foo_radar12278788(); // no-warning
146898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  }();
147898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  ^int() {
148898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    RetVoidFuncType f = foo_radar12278788_fp;
149898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    return ((RetIntFuncType)f)(); //expected-warning {{Undefined or garbage value returned to caller}}
150898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  }();
151898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose}
152