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