1
- // RUN: %clang_cc1 -std=c++14 -triple i386-apple-darwin10 -analyze -analyzer-checker=core.builtin,debug.ExprInspection -verify %s
1
+ // RUN: %clang_cc1 -std=c++14 -triple i386-apple-darwin10 -analyze -analyzer-config eagerly-assume=false -analyzer- checker=core.uninitialized.Assign,core. builtin,debug.ExprInspection,core.uninitialized.UndefReturn -verify %s
2
2
3
3
void clang_analyzer_eval (int );
4
4
@@ -18,3 +18,113 @@ void arr2init() {
18
18
// FIXME: Should recognize that it is 0.
19
19
clang_analyzer_eval (arr[i][0 ]); // expected-warning{{UNKNOWN}}
20
20
}
21
+
22
+ int const glob_arr1[3 ] = {};
23
+ void glob_array_index1 () {
24
+ clang_analyzer_eval (glob_arr1[0 ] == 0 ); // expected-warning{{TRUE}}
25
+ clang_analyzer_eval (glob_arr1[1 ] == 0 ); // expected-warning{{TRUE}}
26
+ clang_analyzer_eval (glob_arr1[2 ] == 0 ); // expected-warning{{TRUE}}
27
+ }
28
+
29
+ void glob_invalid_index1 () {
30
+ const int *ptr = glob_arr1;
31
+ int idx = -42 ;
32
+ auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
33
+ }
34
+
35
+ int const glob_arr2[4 ] = {1 , 2 };
36
+ void glob_ptr_index1 () {
37
+ int const *ptr = glob_arr2;
38
+ clang_analyzer_eval (ptr[0 ] == 1 ); // expected-warning{{TRUE}}
39
+ clang_analyzer_eval (ptr[1 ] == 2 ); // expected-warning{{TRUE}}
40
+ clang_analyzer_eval (ptr[2 ] == 0 ); // expected-warning{{TRUE}}
41
+ clang_analyzer_eval (ptr[3 ] == 0 ); // expected-warning{{TRUE}}
42
+ clang_analyzer_eval (ptr[4 ] == 0 ); // expected-warning{{UNDEFINED}}
43
+ }
44
+
45
+ void glob_invalid_index2 () {
46
+ const int *ptr = glob_arr2;
47
+ int idx = 42 ;
48
+ auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
49
+ }
50
+
51
+ const float glob_arr3[] = {
52
+ 0.0000 , 0.0235 , 0.0470 , 0.0706 , 0.0941 , 0.1176 };
53
+ float no_warn_garbage_value () {
54
+ return glob_arr3[0 ]; // no-warning (garbage or undefined)
55
+ }
56
+
57
+ // TODO: Support multidimensional array.
58
+ int const glob_arr4[4 ][2 ] = {};
59
+ void glob_array_index2 () {
60
+ // FIXME: Should be TRUE.
61
+ clang_analyzer_eval (glob_arr4[1 ][0 ] == 0 ); // expected-warning{{UNKNOWN}}
62
+ // FIXME: Should be TRUE.
63
+ clang_analyzer_eval (glob_arr4[1 ][1 ] == 0 ); // expected-warning{{UNKNOWN}}
64
+ }
65
+
66
+ // TODO: Support multidimensional array.
67
+ void glob_invalid_index3 () {
68
+ int idx = -42 ;
69
+ // FIXME: Should warn {{garbage or undefined}}.
70
+ auto x = glob_arr4[1 ][idx]; // no-warning
71
+ }
72
+
73
+ // TODO: Support multidimensional array.
74
+ void glob_invalid_index4 () {
75
+ const int *ptr = glob_arr4[1 ];
76
+ int idx = -42 ;
77
+ // FIXME: Should warn {{garbage or undefined}}.
78
+ auto x = ptr[idx]; // no-warning
79
+ }
80
+
81
+ // TODO: Support multidimensional array.
82
+ int const glob_arr5[4 ][2 ] = {{1 }, 3 , 4 , 5 };
83
+ void glob_array_index3 () {
84
+ // FIXME: Should be TRUE.
85
+ clang_analyzer_eval (glob_arr5[0 ][0 ] == 1 ); // expected-warning{{UNKNOWN}}
86
+ // FIXME: Should be TRUE.
87
+ clang_analyzer_eval (glob_arr5[0 ][1 ] == 0 ); // expected-warning{{UNKNOWN}}
88
+ // FIXME: Should be TRUE.
89
+ clang_analyzer_eval (glob_arr5[1 ][0 ] == 3 ); // expected-warning{{UNKNOWN}}
90
+ // FIXME: Should be TRUE.
91
+ clang_analyzer_eval (glob_arr5[1 ][1 ] == 4 ); // expected-warning{{UNKNOWN}}
92
+ // FIXME: Should be TRUE.
93
+ clang_analyzer_eval (glob_arr5[2 ][0 ] == 5 ); // expected-warning{{UNKNOWN}}
94
+ // FIXME: Should be TRUE.
95
+ clang_analyzer_eval (glob_arr5[2 ][1 ] == 0 ); // expected-warning{{UNKNOWN}}
96
+ // FIXME: Should be TRUE.
97
+ clang_analyzer_eval (glob_arr5[3 ][0 ] == 0 ); // expected-warning{{UNKNOWN}}
98
+ // FIXME: Should be TRUE.
99
+ clang_analyzer_eval (glob_arr5[3 ][1 ] == 0 ); // expected-warning{{UNKNOWN}}
100
+ }
101
+
102
+ // TODO: Support multidimensional array.
103
+ void glob_ptr_index2 () {
104
+ int const *ptr = glob_arr5[1 ];
105
+ // FIXME: Should be TRUE.
106
+ clang_analyzer_eval (ptr[0 ] == 3 ); // expected-warning{{UNKNOWN}}
107
+ // FIXME: Should be TRUE.
108
+ clang_analyzer_eval (ptr[1 ] == 4 ); // expected-warning{{UNKNOWN}}
109
+ // FIXME: Should be UNDEFINED.
110
+ clang_analyzer_eval (ptr[2 ] == 5 ); // expected-warning{{UNKNOWN}}
111
+ // FIXME: Should be UNDEFINED.
112
+ clang_analyzer_eval (ptr[3 ] == 0 ); // expected-warning{{UNKNOWN}}
113
+ // FIXME: Should be UNDEFINED.
114
+ clang_analyzer_eval (ptr[4 ] == 0 ); // expected-warning{{UNKNOWN}}
115
+ }
116
+
117
+ // TODO: Support multidimensional array.
118
+ void glob_invalid_index5 () {
119
+ int idx = -42 ;
120
+ // FIXME: Should warn {{garbage or undefined}}.
121
+ auto x = glob_arr5[1 ][idx]; // no-warning
122
+ }
123
+
124
+ // TODO: Support multidimensional array.
125
+ void glob_invalid_index6 () {
126
+ int const *ptr = &glob_arr5[1 ][0 ];
127
+ int idx = 42 ;
128
+ // FIXME: Should warn {{garbage or undefined}}.
129
+ auto x = ptr[idx]; // // no-warning
130
+ }
0 commit comments