1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=cplusplus.NewDelete,core,alpha.core.CallAndMessageUnInitRefArg -analyzer-output=text -verify %s 2*67e74705SXin Li // Passing uninitialized const data to unknown function 3*67e74705SXin Li 4*67e74705SXin Li #include "Inputs/system-header-simulator-cxx.h" 5*67e74705SXin Li 6*67e74705SXin Li void doStuff6(const int& c); 7*67e74705SXin Li void doStuff4(const int y); 8*67e74705SXin Li void doStuff3(int& g); 9*67e74705SXin Li void doStuff_uninit(const int *u); 10*67e74705SXin Li 11*67e74705SXin Li f10(void)12*67e74705SXin Liint f10(void) { 13*67e74705SXin Li int *ptr; 14*67e74705SXin Li 15*67e74705SXin Li ptr = new int; // 16*67e74705SXin Li if(*ptr) { 17*67e74705SXin Li doStuff4(*ptr); 18*67e74705SXin Li } 19*67e74705SXin Li delete ptr; 20*67e74705SXin Li return 0; 21*67e74705SXin Li } 22*67e74705SXin Li f9(void)23*67e74705SXin Liint f9(void) { 24*67e74705SXin Li int *ptr; 25*67e74705SXin Li 26*67e74705SXin Li ptr = new int; // 27*67e74705SXin Li 28*67e74705SXin Li doStuff_uninit(ptr); // no warning 29*67e74705SXin Li delete ptr; 30*67e74705SXin Li return 0; 31*67e74705SXin Li } 32*67e74705SXin Li f8(void)33*67e74705SXin Liint f8(void) { 34*67e74705SXin Li int *ptr; 35*67e74705SXin Li 36*67e74705SXin Li ptr = new int; 37*67e74705SXin Li *ptr = 25; 38*67e74705SXin Li 39*67e74705SXin Li doStuff_uninit(ptr); // no warning? 40*67e74705SXin Li delete ptr; 41*67e74705SXin Li return 0; 42*67e74705SXin Li } 43*67e74705SXin Li f7(void)44*67e74705SXin Livoid f7(void) { 45*67e74705SXin Li int m = 3; 46*67e74705SXin Li doStuff6(m); // no warning 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li f6_1_sub(int & p)50*67e74705SXin Liint& f6_1_sub(int &p) { 51*67e74705SXin Li return p; 52*67e74705SXin Li } 53*67e74705SXin Li f6_1(void)54*67e74705SXin Livoid f6_1(void) { 55*67e74705SXin Li int t; 56*67e74705SXin Li int p = f6_1_sub(t); //expected-warning {{Assigned value is garbage or undefined}} 57*67e74705SXin Li //expected-note@-1 {{Calling 'f6_1_sub'}} 58*67e74705SXin Li //expected-note@-2 {{Returning from 'f6_1_sub'}} 59*67e74705SXin Li //expected-note@-3 {{Assigned value is garbage or undefined}} 60*67e74705SXin Li int q = p; 61*67e74705SXin Li doStuff6(q); 62*67e74705SXin Li } 63*67e74705SXin Li f6_2(void)64*67e74705SXin Livoid f6_2(void) { 65*67e74705SXin Li int t; //expected-note {{'t' declared without an initial value}} 66*67e74705SXin Li int &p = t; 67*67e74705SXin Li int &s = p; 68*67e74705SXin Li int &q = s; //expected-note {{'q' initialized here}} 69*67e74705SXin Li doStuff6(q); //expected-warning {{Function call argument is an uninitialized value}} 70*67e74705SXin Li //expected-note@-1 {{Function call argument is an uninitialized value}} 71*67e74705SXin Li } 72*67e74705SXin Li doStuff6_3(int & q_,int * ptr_)73*67e74705SXin Livoid doStuff6_3(int& q_, int *ptr_) {} 74*67e74705SXin Li f6_3(void)75*67e74705SXin Livoid f6_3(void) { 76*67e74705SXin Li int *ptr; //expected-note {{'ptr' declared without an initial value}} 77*67e74705SXin Li int t; 78*67e74705SXin Li int &p = t; 79*67e74705SXin Li int &s = p; 80*67e74705SXin Li int &q = s; 81*67e74705SXin Li doStuff6_3(q,ptr); //expected-warning {{Function call argument is an uninitialized value}} 82*67e74705SXin Li //expected-note@-1 {{Function call argument is an uninitialized value}} 83*67e74705SXin Li 84*67e74705SXin Li } 85*67e74705SXin Li f6(void)86*67e74705SXin Livoid f6(void) { 87*67e74705SXin Li int k; // expected-note {{'k' declared without an initial value}} 88*67e74705SXin Li doStuff6(k); // expected-warning {{Function call argument is an uninitialized value}} 89*67e74705SXin Li // expected-note@-1 {{Function call argument is an uninitialized value}} 90*67e74705SXin Li 91*67e74705SXin Li } 92*67e74705SXin Li 93*67e74705SXin Li 94*67e74705SXin Li f5(void)95*67e74705SXin Livoid f5(void) { 96*67e74705SXin Li int t; 97*67e74705SXin Li int* tp = &t; // expected-note {{'tp' initialized here}} 98*67e74705SXin Li doStuff_uninit(tp); // expected-warning {{Function call argument is a pointer to uninitialized value}} 99*67e74705SXin Li // expected-note@-1 {{Function call argument is a pointer to uninitialized value}} 100*67e74705SXin Li } 101*67e74705SXin Li 102*67e74705SXin Li f4(void)103*67e74705SXin Livoid f4(void) { 104*67e74705SXin Li int y; // expected-note {{'y' declared without an initial value}} 105*67e74705SXin Li doStuff4(y); // expected-warning {{Function call argument is an uninitialized value}} 106*67e74705SXin Li // expected-note@-1 {{Function call argument is an uninitialized value}} 107*67e74705SXin Li } 108*67e74705SXin Li f3(void)109*67e74705SXin Livoid f3(void) { 110*67e74705SXin Li int g; 111*67e74705SXin Li doStuff3(g); // no warning 112*67e74705SXin Li } 113*67e74705SXin Li 114*67e74705SXin Li int z; f2(void)115*67e74705SXin Livoid f2(void) { 116*67e74705SXin Li doStuff_uninit(&z); // no warning 117*67e74705SXin Li } 118*67e74705SXin Li f1(void)119*67e74705SXin Livoid f1(void) { 120*67e74705SXin Li int x_=5; 121*67e74705SXin Li doStuff_uninit(&x_); // no warning 122*67e74705SXin Li } 123*67e74705SXin Li f_uninit(void)124*67e74705SXin Livoid f_uninit(void) { 125*67e74705SXin Li int x; 126*67e74705SXin Li doStuff_uninit(&x); // expected-warning {{Function call argument is a pointer to uninitialized value}} 127*67e74705SXin Li // expected-note@-1 {{Function call argument is a pointer to uninitialized value}} 128*67e74705SXin Li } 129