1*a46154cbSisuckatcs // RUN: %clang_analyze_cc1 %s -analyzer-checker=core.uninitialized.NewArraySize -analyzer-output=text -verify 2*a46154cbSisuckatcs 3*a46154cbSisuckatcs #include "Inputs/system-header-simulator-cxx.h" 4*a46154cbSisuckatcs checkUndefinedElmenetCountValue()5*a46154cbSisuckatcsvoid checkUndefinedElmenetCountValue() { 6*a46154cbSisuckatcs int n; 7*a46154cbSisuckatcs // expected-note@-1{{'n' declared without an initial value}} 8*a46154cbSisuckatcs 9*a46154cbSisuckatcs int *arr = new int[n]; // expected-warning{{Element count in new[] is a garbage value}} 10*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 11*a46154cbSisuckatcs } 12*a46154cbSisuckatcs checkUndefinedElmenetCountMultiDimensionalValue()13*a46154cbSisuckatcsvoid checkUndefinedElmenetCountMultiDimensionalValue() { 14*a46154cbSisuckatcs int n; 15*a46154cbSisuckatcs // expected-note@-1{{'n' declared without an initial value}} 16*a46154cbSisuckatcs 17*a46154cbSisuckatcs auto *arr = new int[n][5]; // expected-warning{{Element count in new[] is a garbage value}} 18*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 19*a46154cbSisuckatcs } 20*a46154cbSisuckatcs checkUndefinedElmenetCountReference()21*a46154cbSisuckatcsvoid checkUndefinedElmenetCountReference() { 22*a46154cbSisuckatcs int n; 23*a46154cbSisuckatcs // expected-note@-1{{'n' declared without an initial value}} 24*a46154cbSisuckatcs 25*a46154cbSisuckatcs int &ref = n; 26*a46154cbSisuckatcs // expected-note@-1{{'ref' initialized here}} 27*a46154cbSisuckatcs 28*a46154cbSisuckatcs int *arr = new int[ref]; // expected-warning{{Element count in new[] is a garbage value}} 29*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 30*a46154cbSisuckatcs } 31*a46154cbSisuckatcs checkUndefinedElmenetCountMultiDimensionalReference()32*a46154cbSisuckatcsvoid checkUndefinedElmenetCountMultiDimensionalReference() { 33*a46154cbSisuckatcs int n; 34*a46154cbSisuckatcs // expected-note@-1{{'n' declared without an initial value}} 35*a46154cbSisuckatcs 36*a46154cbSisuckatcs int &ref = n; 37*a46154cbSisuckatcs // expected-note@-1{{'ref' initialized here}} 38*a46154cbSisuckatcs 39*a46154cbSisuckatcs auto *arr = new int[ref][5]; // expected-warning{{Element count in new[] is a garbage value}} 40*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 41*a46154cbSisuckatcs } 42*a46154cbSisuckatcs foo()43*a46154cbSisuckatcsint foo() { 44*a46154cbSisuckatcs int n; 45*a46154cbSisuckatcs 46*a46154cbSisuckatcs return n; 47*a46154cbSisuckatcs } 48*a46154cbSisuckatcs checkUndefinedElmenetCountFunction()49*a46154cbSisuckatcsvoid checkUndefinedElmenetCountFunction() { 50*a46154cbSisuckatcs int *arr = new int[foo()]; // expected-warning{{Element count in new[] is a garbage value}} 51*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 52*a46154cbSisuckatcs } 53*a46154cbSisuckatcs checkUndefinedElmenetCountMultiDimensionalFunction()54*a46154cbSisuckatcsvoid checkUndefinedElmenetCountMultiDimensionalFunction() { 55*a46154cbSisuckatcs auto *arr = new int[foo()][5]; // expected-warning{{Element count in new[] is a garbage value}} 56*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 57*a46154cbSisuckatcs } 58*a46154cbSisuckatcs 59*a46154cbSisuckatcs void *malloc(size_t); 60*a46154cbSisuckatcs checkUndefinedPlacementElementCount()61*a46154cbSisuckatcsvoid checkUndefinedPlacementElementCount() { 62*a46154cbSisuckatcs int n; 63*a46154cbSisuckatcs // expected-note@-1{{'n' declared without an initial value}} 64*a46154cbSisuckatcs 65*a46154cbSisuckatcs void *buffer = malloc(sizeof(std::string) * 10); 66*a46154cbSisuckatcs std::string *p = 67*a46154cbSisuckatcs ::new (buffer) std::string[n]; // expected-warning{{Element count in new[] is a garbage value}} 68*a46154cbSisuckatcs // expected-note@-1{{Element count in new[] is a garbage value}} 69*a46154cbSisuckatcs } 70