xref: /llvm-project/clang/test/Analysis/undefined-new-element.cpp (revision a46154cb1cd09aa26bc803d8696e6e9283aac6a9)
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*a46154cbSisuckatcs void 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*a46154cbSisuckatcs void 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*a46154cbSisuckatcs void 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*a46154cbSisuckatcs void 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*a46154cbSisuckatcs int foo() {
44*a46154cbSisuckatcs   int n;
45*a46154cbSisuckatcs 
46*a46154cbSisuckatcs   return n;
47*a46154cbSisuckatcs }
48*a46154cbSisuckatcs 
checkUndefinedElmenetCountFunction()49*a46154cbSisuckatcs void 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*a46154cbSisuckatcs void 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*a46154cbSisuckatcs void 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