xref: /minix3/external/bsd/llvm/dist/clang/test/Analysis/uninit-const.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -analyze -analyzer-checker=unix.Malloc,core,alpha.core.CallAndMessageUnInitRefArg -analyzer-output=text -verify %s
2*0a6a1f1dSLionel Sambuc 
3*0a6a1f1dSLionel Sambuc // Passing uninitialized const data to function
4*0a6a1f1dSLionel Sambuc #include "Inputs/system-header-simulator.h"
5*0a6a1f1dSLionel Sambuc 
6*0a6a1f1dSLionel Sambuc typedef __typeof(sizeof(int)) size_t;
7*0a6a1f1dSLionel Sambuc void *malloc(size_t);
8*0a6a1f1dSLionel Sambuc void *valloc(size_t);
9*0a6a1f1dSLionel Sambuc void free(void *);
10*0a6a1f1dSLionel Sambuc 
11*0a6a1f1dSLionel Sambuc 
doStuff3(const int y)12*0a6a1f1dSLionel Sambuc void doStuff3(const int y){}
doStuff2(int g)13*0a6a1f1dSLionel Sambuc void doStuff2(int g){}
doStuff_pointerToConstInt(const int * u)14*0a6a1f1dSLionel Sambuc void doStuff_pointerToConstInt(const int *u){};
doStuff_arrayOfConstInt(const int a[])15*0a6a1f1dSLionel Sambuc void doStuff_arrayOfConstInt(const int a[]){};
16*0a6a1f1dSLionel Sambuc 
doStuff_constPointerToConstInt(int const * const u)17*0a6a1f1dSLionel Sambuc void doStuff_constPointerToConstInt              (int const * const u){};
doStuff_constPointerToConstPointerToConstInt(int const * const * const u)18*0a6a1f1dSLionel Sambuc void doStuff_constPointerToConstPointerToConstInt(int const * const * const u){};
doStuff_pointerToConstPointerToConstInt(int const * const * u)19*0a6a1f1dSLionel Sambuc void doStuff_pointerToConstPointerToConstInt(int const * const * u){};
doStuff_pointerToPointerToConstInt(int const ** u)20*0a6a1f1dSLionel Sambuc void doStuff_pointerToPointerToConstInt       (int const **u){};
doStuff_constStaticSizedArray(const int a[static10])21*0a6a1f1dSLionel Sambuc void doStuff_constStaticSizedArray(const int a[static 10]) {}
doStuff_variadic(const int * u,...)22*0a6a1f1dSLionel Sambuc void doStuff_variadic(const int *u, ...){};
23*0a6a1f1dSLionel Sambuc 
f_1(void)24*0a6a1f1dSLionel Sambuc void f_1(void) {
25*0a6a1f1dSLionel Sambuc   int t;
26*0a6a1f1dSLionel Sambuc   int* tp = &t;        // expected-note {{'tp' initialized here}}
27*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(tp);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
28*0a6a1f1dSLionel Sambuc                        // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
29*0a6a1f1dSLionel Sambuc }
30*0a6a1f1dSLionel Sambuc 
f_1_1(void)31*0a6a1f1dSLionel Sambuc void f_1_1(void) {
32*0a6a1f1dSLionel Sambuc   int t;
33*0a6a1f1dSLionel Sambuc   int* tp1 = &t;
34*0a6a1f1dSLionel Sambuc   int* tp2 = tp1;        // expected-note {{'tp2' initialized here}}
35*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(tp2);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
36*0a6a1f1dSLionel Sambuc                        // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
37*0a6a1f1dSLionel Sambuc }
38*0a6a1f1dSLionel Sambuc 
39*0a6a1f1dSLionel Sambuc 
f_2_sub(int * p)40*0a6a1f1dSLionel Sambuc int *f_2_sub(int *p) {
41*0a6a1f1dSLionel Sambuc   return p;
42*0a6a1f1dSLionel Sambuc }
43*0a6a1f1dSLionel Sambuc 
f_2(void)44*0a6a1f1dSLionel Sambuc void f_2(void) {
45*0a6a1f1dSLionel Sambuc   int t;
46*0a6a1f1dSLionel Sambuc   int* p = f_2_sub(&t);
47*0a6a1f1dSLionel Sambuc   int* tp = p; // expected-note {{'tp' initialized here}}
48*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(tp); // expected-warning {{Function call argument is a pointer to uninitialized value}}
49*0a6a1f1dSLionel Sambuc                       // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
50*0a6a1f1dSLionel Sambuc }
51*0a6a1f1dSLionel Sambuc 
52*0a6a1f1dSLionel Sambuc int z;
f_3(void)53*0a6a1f1dSLionel Sambuc void f_3(void) {
54*0a6a1f1dSLionel Sambuc       doStuff_pointerToConstInt(&z);  // no warning
55*0a6a1f1dSLionel Sambuc }
56*0a6a1f1dSLionel Sambuc 
f_4(void)57*0a6a1f1dSLionel Sambuc void f_4(void) {
58*0a6a1f1dSLionel Sambuc       int x=5;
59*0a6a1f1dSLionel Sambuc       doStuff_pointerToConstInt(&x);  // no warning
60*0a6a1f1dSLionel Sambuc }
61*0a6a1f1dSLionel Sambuc 
f_5(void)62*0a6a1f1dSLionel Sambuc void f_5(void) {
63*0a6a1f1dSLionel Sambuc   int ta[5];
64*0a6a1f1dSLionel Sambuc   int* tp = ta;        // expected-note {{'tp' initialized here}}
65*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(tp);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
66*0a6a1f1dSLionel Sambuc                        // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
67*0a6a1f1dSLionel Sambuc }
68*0a6a1f1dSLionel Sambuc 
f_5_1(void)69*0a6a1f1dSLionel Sambuc void f_5_1(void) {
70*0a6a1f1dSLionel Sambuc   int ta[5];        // expected-note {{'ta' initialized here}}
71*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(ta);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
72*0a6a1f1dSLionel Sambuc                        // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
73*0a6a1f1dSLionel Sambuc }
74*0a6a1f1dSLionel Sambuc 
f_6(void)75*0a6a1f1dSLionel Sambuc void f_6(void) {
76*0a6a1f1dSLionel Sambuc   int ta[5] = {1,2,3,4,5};
77*0a6a1f1dSLionel Sambuc   int* tp = ta;
78*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(tp); // no-warning
79*0a6a1f1dSLionel Sambuc }
80*0a6a1f1dSLionel Sambuc 
f_6_1(void)81*0a6a1f1dSLionel Sambuc void f_6_1(void) {
82*0a6a1f1dSLionel Sambuc   int ta[5] = {1,2,3,4,5};
83*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(ta); // no-warning
84*0a6a1f1dSLionel Sambuc }
85*0a6a1f1dSLionel Sambuc 
f_7(void)86*0a6a1f1dSLionel Sambuc void f_7(void) {
87*0a6a1f1dSLionel Sambuc       int z;        // expected-note {{'z' declared without an initial value}}
88*0a6a1f1dSLionel Sambuc       int y=z;      // expected-warning {{Assigned value is garbage or undefined}}
89*0a6a1f1dSLionel Sambuc                     // expected-note@-1 {{Assigned value is garbage or undefined}}
90*0a6a1f1dSLionel Sambuc       doStuff3(y);
91*0a6a1f1dSLionel Sambuc }
92*0a6a1f1dSLionel Sambuc 
f_8(void)93*0a6a1f1dSLionel Sambuc void f_8(void) {
94*0a6a1f1dSLionel Sambuc       int g;       // expected-note {{'g' declared without an initial value}}
95*0a6a1f1dSLionel Sambuc       doStuff2(g); // expected-warning {{Function call argument is an uninitialized value}}
96*0a6a1f1dSLionel Sambuc                    // expected-note@-1 {{Function call argument is an uninitialized value}}
97*0a6a1f1dSLionel Sambuc }
98*0a6a1f1dSLionel Sambuc 
f_9(void)99*0a6a1f1dSLionel Sambuc void f_9(void) {
100*0a6a1f1dSLionel Sambuc   int  a[6];
101*0a6a1f1dSLionel Sambuc   int const *ptau = a;             // expected-note {{'ptau' initialized here}}
102*0a6a1f1dSLionel Sambuc   doStuff_arrayOfConstInt(ptau);    // expected-warning {{Function call argument is a pointer to uninitialized value}}
103*0a6a1f1dSLionel Sambuc                                    // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
104*0a6a1f1dSLionel Sambuc }
105*0a6a1f1dSLionel Sambuc 
f_10(void)106*0a6a1f1dSLionel Sambuc void f_10(void) {
107*0a6a1f1dSLionel Sambuc   int  a[6];                     // expected-note {{'a' initialized here}}
108*0a6a1f1dSLionel Sambuc   doStuff_arrayOfConstInt(a);    // expected-warning {{Function call argument is a pointer to uninitialized value}}
109*0a6a1f1dSLionel Sambuc                                  // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
110*0a6a1f1dSLionel Sambuc }
111*0a6a1f1dSLionel Sambuc 
f_11(void)112*0a6a1f1dSLionel Sambuc void f_11(void) {
113*0a6a1f1dSLionel Sambuc   int t[10];                    //expected-note {{'t' initialized here}}
114*0a6a1f1dSLionel Sambuc   doStuff_constStaticSizedArray(t);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
115*0a6a1f1dSLionel Sambuc                                 // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
116*0a6a1f1dSLionel Sambuc }
117*0a6a1f1dSLionel Sambuc 
f_12(void)118*0a6a1f1dSLionel Sambuc void f_12(void) {
119*0a6a1f1dSLionel Sambuc   int t[10] = {0,1,2,3,4,5,6,7,8,9};
120*0a6a1f1dSLionel Sambuc   doStuff_constStaticSizedArray(t);  // no-warning
121*0a6a1f1dSLionel Sambuc 
122*0a6a1f1dSLionel Sambuc }
123*0a6a1f1dSLionel Sambuc 
f_malloc_1(void)124*0a6a1f1dSLionel Sambuc int f_malloc_1(void) {
125*0a6a1f1dSLionel Sambuc   int *ptr;
126*0a6a1f1dSLionel Sambuc 
127*0a6a1f1dSLionel Sambuc   ptr = (int *)malloc(sizeof(int)); // expected-note {{Value assigned to 'ptr'}}
128*0a6a1f1dSLionel Sambuc 
129*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(ptr); // expected-warning {{Function call argument is a pointer to uninitialized value}}
130*0a6a1f1dSLionel Sambuc                        // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
131*0a6a1f1dSLionel Sambuc   free(ptr);
132*0a6a1f1dSLionel Sambuc   return 0;
133*0a6a1f1dSLionel Sambuc }
134*0a6a1f1dSLionel Sambuc 
f_malloc_2(void)135*0a6a1f1dSLionel Sambuc int f_malloc_2(void) {
136*0a6a1f1dSLionel Sambuc   int *ptr;
137*0a6a1f1dSLionel Sambuc 
138*0a6a1f1dSLionel Sambuc   ptr = (int *)malloc(sizeof(int));
139*0a6a1f1dSLionel Sambuc   *ptr = 25;
140*0a6a1f1dSLionel Sambuc 
141*0a6a1f1dSLionel Sambuc   doStuff_pointerToConstInt(ptr); // no warning
142*0a6a1f1dSLionel Sambuc   free(ptr);
143*0a6a1f1dSLionel Sambuc   return 0;
144*0a6a1f1dSLionel Sambuc }
145*0a6a1f1dSLionel Sambuc 
146*0a6a1f1dSLionel Sambuc // uninit pointer, uninit val
f_variadic_unp_unv(void)147*0a6a1f1dSLionel Sambuc void f_variadic_unp_unv(void) {
148*0a6a1f1dSLionel Sambuc   int t;
149*0a6a1f1dSLionel Sambuc   int v;
150*0a6a1f1dSLionel Sambuc   int* tp = &t;           // expected-note {{'tp' initialized here}}
151*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,v);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
152*0a6a1f1dSLionel Sambuc                           // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
153*0a6a1f1dSLionel Sambuc }
154*0a6a1f1dSLionel Sambuc // uninit pointer, init val
f_variadic_unp_inv(void)155*0a6a1f1dSLionel Sambuc void f_variadic_unp_inv(void) {
156*0a6a1f1dSLionel Sambuc   int t;
157*0a6a1f1dSLionel Sambuc   int v = 3;
158*0a6a1f1dSLionel Sambuc   int* tp = &t;           // expected-note {{'tp' initialized here}}
159*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,v);  // expected-warning {{Function call argument is a pointer to uninitialized value}}
160*0a6a1f1dSLionel Sambuc                           // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
161*0a6a1f1dSLionel Sambuc }
162*0a6a1f1dSLionel Sambuc 
163*0a6a1f1dSLionel Sambuc // init pointer, uninit val
f_variadic_inp_unv(void)164*0a6a1f1dSLionel Sambuc void f_variadic_inp_unv(void) {
165*0a6a1f1dSLionel Sambuc   int t=5;
166*0a6a1f1dSLionel Sambuc   int v;                  // expected-note {{'v' declared without an initial value}}
167*0a6a1f1dSLionel Sambuc   int* tp = &t;
168*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,v);// expected-warning {{Function call argument is an uninitialized value}}
169*0a6a1f1dSLionel Sambuc                           // expected-note@-1 {{Function call argument is an uninitialized value}}
170*0a6a1f1dSLionel Sambuc }
171*0a6a1f1dSLionel Sambuc 
172*0a6a1f1dSLionel Sambuc // init pointer, init val
f_variadic_inp_inv(void)173*0a6a1f1dSLionel Sambuc void f_variadic_inp_inv(void) {
174*0a6a1f1dSLionel Sambuc   int t=5;
175*0a6a1f1dSLionel Sambuc   int v = 3;
176*0a6a1f1dSLionel Sambuc   int* tp = &t;
177*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,v); // no-warning
178*0a6a1f1dSLionel Sambuc }
179*0a6a1f1dSLionel Sambuc 
180*0a6a1f1dSLionel Sambuc // init pointer, init pointer
f_variadic_inp_inp(void)181*0a6a1f1dSLionel Sambuc void f_variadic_inp_inp(void) {
182*0a6a1f1dSLionel Sambuc   int t=5;
183*0a6a1f1dSLionel Sambuc   int u=3;
184*0a6a1f1dSLionel Sambuc   int *vp = &u ;
185*0a6a1f1dSLionel Sambuc   int *tp = &t;
186*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,vp); // no-warning
187*0a6a1f1dSLionel Sambuc }
188*0a6a1f1dSLionel Sambuc 
189*0a6a1f1dSLionel Sambuc //uninit pointer, init pointer
f_variadic_unp_inp(void)190*0a6a1f1dSLionel Sambuc void f_variadic_unp_inp(void) {
191*0a6a1f1dSLionel Sambuc   int t;
192*0a6a1f1dSLionel Sambuc   int u=3;
193*0a6a1f1dSLionel Sambuc   int *vp = &u ;
194*0a6a1f1dSLionel Sambuc   int *tp = &t;             // expected-note {{'tp' initialized here}}
195*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,vp); // expected-warning {{Function call argument is a pointer to uninitialized value}}
196*0a6a1f1dSLionel Sambuc                             // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
197*0a6a1f1dSLionel Sambuc }
198*0a6a1f1dSLionel Sambuc 
199*0a6a1f1dSLionel Sambuc //init pointer, uninit pointer
f_variadic_inp_unp(void)200*0a6a1f1dSLionel Sambuc void f_variadic_inp_unp(void) {
201*0a6a1f1dSLionel Sambuc   int t=5;
202*0a6a1f1dSLionel Sambuc   int u;
203*0a6a1f1dSLionel Sambuc   int *vp = &u ;
204*0a6a1f1dSLionel Sambuc   int *tp = &t;
205*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,vp); // no-warning
206*0a6a1f1dSLionel Sambuc }
207*0a6a1f1dSLionel Sambuc 
208*0a6a1f1dSLionel Sambuc //uninit pointer, uninit pointer
f_variadic_unp_unp(void)209*0a6a1f1dSLionel Sambuc void f_variadic_unp_unp(void) {
210*0a6a1f1dSLionel Sambuc   int t;
211*0a6a1f1dSLionel Sambuc   int u;
212*0a6a1f1dSLionel Sambuc   int *vp = &u ;
213*0a6a1f1dSLionel Sambuc   int *tp = &t;             // expected-note {{'tp' initialized here}}
214*0a6a1f1dSLionel Sambuc   doStuff_variadic(tp,vp); // expected-warning {{Function call argument is a pointer to uninitialized value}}
215*0a6a1f1dSLionel Sambuc                             // expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
216*0a6a1f1dSLionel Sambuc }
217