xref: /aosp_15_r20/external/clang/test/Analysis/uninit-const.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li int 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 Li int 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 Li int 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 Li void 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 Li int& f6_1_sub(int &p) {
51*67e74705SXin Li   return p;
52*67e74705SXin Li }
53*67e74705SXin Li 
f6_1(void)54*67e74705SXin Li void 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 Li void 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 Li void doStuff6_3(int& q_, int *ptr_) {}
74*67e74705SXin Li 
f6_3(void)75*67e74705SXin Li void 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 Li void 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 Li void 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 Li void 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 Li void 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 Li void f2(void) {
116*67e74705SXin Li       doStuff_uninit(&z);  // no warning
117*67e74705SXin Li }
118*67e74705SXin Li 
f1(void)119*67e74705SXin Li void 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 Li void 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