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