1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -std=c++17 -verify %s 2 3 void clang_analyzer_eval(bool); 4 5 void array_init() { 6 int arr[] = {1, 2, 3, 4, 5}; 7 8 auto [a, b, c, d, e] = arr; 9 10 clang_analyzer_eval(a == 1); // expected-warning{{TRUE}} 11 clang_analyzer_eval(b == 2); // expected-warning{{TRUE}} 12 clang_analyzer_eval(c == 3); // expected-warning{{TRUE}} 13 clang_analyzer_eval(d == 4); // expected-warning{{TRUE}} 14 clang_analyzer_eval(e == 5); // expected-warning{{TRUE}} 15 } 16 17 void array_uninit() { 18 int arr[5]; 19 20 auto [a, b, c, d, e] = arr; 21 22 int x = e; // expected-warning{{Assigned value is garbage or undefined}} 23 } 24 25 void lambda_init() { 26 int arr[] = {1, 2, 3, 4, 5}; 27 28 auto l = [arr] { return arr[0]; }(); 29 clang_analyzer_eval(l == 1); // expected-warning{{TRUE}} 30 31 l = [arr] { return arr[1]; }(); 32 clang_analyzer_eval(l == 2); // expected-warning{{TRUE}} 33 34 l = [arr] { return arr[2]; }(); 35 clang_analyzer_eval(l == 3); // expected-warning{{TRUE}} 36 37 l = [arr] { return arr[3]; }(); 38 clang_analyzer_eval(l == 4); // expected-warning{{TRUE}} 39 40 l = [arr] { return arr[4]; }(); 41 clang_analyzer_eval(l == 5); // expected-warning{{TRUE}} 42 } 43 44 void lambda_uninit() { 45 int arr[5]; 46 47 // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal 48 int l = [arr] { return arr[0]; }(); 49 clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 50 51 l = [arr] { return arr[1]; }(); 52 clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 53 54 l = [arr] { return arr[2]; }(); 55 clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 56 57 l = [arr] { return arr[3]; }(); 58 clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 59 60 l = [arr] { return arr[4]; }(); 61 clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 62 } 63 64 struct S { 65 int arr[5]; 66 }; 67 68 void copy_ctor_init() { 69 S orig; 70 orig.arr[0] = 1; 71 orig.arr[1] = 2; 72 orig.arr[2] = 3; 73 orig.arr[3] = 4; 74 orig.arr[4] = 5; 75 76 S copy = orig; 77 clang_analyzer_eval(copy.arr[0] == 1); // expected-warning{{TRUE}} 78 clang_analyzer_eval(copy.arr[1] == 2); // expected-warning{{TRUE}} 79 clang_analyzer_eval(copy.arr[2] == 3); // expected-warning{{TRUE}} 80 clang_analyzer_eval(copy.arr[3] == 4); // expected-warning{{TRUE}} 81 clang_analyzer_eval(copy.arr[4] == 5); // expected-warning{{TRUE}} 82 } 83 84 void copy_ctor_uninit() { 85 S orig; 86 87 S copy = orig; 88 89 // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal. 90 // If the struct is not considered a small struct, instead of a copy, we store a lazy compound value. 91 // As the struct has an array data member, it is not considered small. 92 clang_analyzer_eval(copy.arr[0]); // expected-warning{{UNKNOWN}} 93 clang_analyzer_eval(copy.arr[1]); // expected-warning{{UNKNOWN}} 94 clang_analyzer_eval(copy.arr[2]); // expected-warning{{UNKNOWN}} 95 clang_analyzer_eval(copy.arr[3]); // expected-warning{{UNKNOWN}} 96 clang_analyzer_eval(copy.arr[4]); // expected-warning{{UNKNOWN}} 97 } 98 99 void move_ctor_init() { 100 S orig; 101 orig.arr[0] = 1; 102 orig.arr[1] = 2; 103 orig.arr[2] = 3; 104 orig.arr[3] = 4; 105 orig.arr[4] = 5; 106 107 S moved = (S &&) orig; 108 109 clang_analyzer_eval(moved.arr[0] == 1); // expected-warning{{TRUE}} 110 clang_analyzer_eval(moved.arr[1] == 2); // expected-warning{{TRUE}} 111 clang_analyzer_eval(moved.arr[2] == 3); // expected-warning{{TRUE}} 112 clang_analyzer_eval(moved.arr[3] == 4); // expected-warning{{TRUE}} 113 clang_analyzer_eval(moved.arr[4] == 5); // expected-warning{{TRUE}} 114 } 115 116 void move_ctor_uninit() { 117 S orig; 118 119 S moved = (S &&) orig; 120 121 // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal. 122 clang_analyzer_eval(moved.arr[0]); // expected-warning{{UNKNOWN}} 123 clang_analyzer_eval(moved.arr[1]); // expected-warning{{UNKNOWN}} 124 clang_analyzer_eval(moved.arr[2]); // expected-warning{{UNKNOWN}} 125 clang_analyzer_eval(moved.arr[3]); // expected-warning{{UNKNOWN}} 126 clang_analyzer_eval(moved.arr[4]); // expected-warning{{UNKNOWN}} 127 } 128