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