198a95d48SDenys Petrov // 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
20137aa86SRafael Stahl
344e803efSDenys Petrov template <typename T>
444e803efSDenys Petrov void clang_analyzer_dump(T x);
50137aa86SRafael Stahl void clang_analyzer_eval(int);
60137aa86SRafael Stahl
70137aa86SRafael Stahl struct S {
80137aa86SRafael Stahl int a = 3;
90137aa86SRafael Stahl };
100137aa86SRafael Stahl S const sarr[2] = {};
definit()110137aa86SRafael Stahl void definit() {
120137aa86SRafael Stahl int i = 1;
130137aa86SRafael Stahl // FIXME: Should recognize that it is 3.
140137aa86SRafael Stahl clang_analyzer_eval(sarr[i].a); // expected-warning{{UNKNOWN}}
150137aa86SRafael Stahl }
160137aa86SRafael Stahl
1798a95d48SDenys Petrov int const glob_arr1[3] = {};
glob_array_index1()1898a95d48SDenys Petrov void glob_array_index1() {
1998a95d48SDenys Petrov clang_analyzer_eval(glob_arr1[0] == 0); // expected-warning{{TRUE}}
2098a95d48SDenys Petrov clang_analyzer_eval(glob_arr1[1] == 0); // expected-warning{{TRUE}}
2198a95d48SDenys Petrov clang_analyzer_eval(glob_arr1[2] == 0); // expected-warning{{TRUE}}
2298a95d48SDenys Petrov }
2398a95d48SDenys Petrov
glob_invalid_index1()2498a95d48SDenys Petrov void glob_invalid_index1() {
2598a95d48SDenys Petrov const int *ptr = glob_arr1;
2698a95d48SDenys Petrov int idx = -42;
2798a95d48SDenys Petrov auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
2898a95d48SDenys Petrov }
2998a95d48SDenys Petrov
glob_symbolic_index1(int idx)3044e803efSDenys Petrov void glob_symbolic_index1(int idx) {
3144e803efSDenys Petrov clang_analyzer_dump(glob_arr1[idx]); // expected-warning{{Unknown}}
3244e803efSDenys Petrov }
3344e803efSDenys Petrov
3498a95d48SDenys Petrov int const glob_arr2[4] = {1, 2};
glob_ptr_index1()3598a95d48SDenys Petrov void glob_ptr_index1() {
3698a95d48SDenys Petrov int const *ptr = glob_arr2;
3798a95d48SDenys Petrov clang_analyzer_eval(ptr[0] == 1); // expected-warning{{TRUE}}
3898a95d48SDenys Petrov clang_analyzer_eval(ptr[1] == 2); // expected-warning{{TRUE}}
3998a95d48SDenys Petrov clang_analyzer_eval(ptr[2] == 0); // expected-warning{{TRUE}}
4098a95d48SDenys Petrov clang_analyzer_eval(ptr[3] == 0); // expected-warning{{TRUE}}
4198a95d48SDenys Petrov clang_analyzer_eval(ptr[4] == 0); // expected-warning{{UNDEFINED}}
4298a95d48SDenys Petrov }
4398a95d48SDenys Petrov
glob_invalid_index2()4498a95d48SDenys Petrov void glob_invalid_index2() {
4598a95d48SDenys Petrov const int *ptr = glob_arr2;
4698a95d48SDenys Petrov int idx = 42;
4798a95d48SDenys Petrov auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
4898a95d48SDenys Petrov }
4998a95d48SDenys Petrov
5098a95d48SDenys Petrov const float glob_arr3[] = {
5198a95d48SDenys Petrov 0.0000, 0.0235, 0.0470, 0.0706, 0.0941, 0.1176};
no_warn_garbage_value()5298a95d48SDenys Petrov float no_warn_garbage_value() {
5398a95d48SDenys Petrov return glob_arr3[0]; // no-warning (garbage or undefined)
5498a95d48SDenys Petrov }
5598a95d48SDenys Petrov
5698a95d48SDenys Petrov int const glob_arr4[4][2] = {};
glob_array_index2()5798a95d48SDenys Petrov void glob_array_index2() {
58a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr4[0][0] == 0); // expected-warning{{TRUE}}
59a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr4[1][0] == 0); // expected-warning{{TRUE}}
60a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr4[1][1] == 0); // expected-warning{{TRUE}}
6198a95d48SDenys Petrov }
6298a95d48SDenys Petrov
glob_invalid_index3()6398a95d48SDenys Petrov void glob_invalid_index3() {
6498a95d48SDenys Petrov int idx = -42;
65a12bfac2SDenys Petrov auto x = glob_arr4[1][idx]; // expected-warning{{garbage or undefined}}
6698a95d48SDenys Petrov }
6798a95d48SDenys Petrov
glob_invalid_index4()6898a95d48SDenys Petrov void glob_invalid_index4() {
6998a95d48SDenys Petrov const int *ptr = glob_arr4[1];
7098a95d48SDenys Petrov int idx = -42;
71*f0bc7d24SDenys Petrov auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
7298a95d48SDenys Petrov }
7398a95d48SDenys Petrov
7498a95d48SDenys Petrov int const glob_arr5[4][2] = {{1}, 3, 4, 5};
glob_array_index3()7598a95d48SDenys Petrov void glob_array_index3() {
76a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[0][0] == 1); // expected-warning{{TRUE}}
77a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[0][1] == 0); // expected-warning{{TRUE}}
78a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[1][0] == 3); // expected-warning{{TRUE}}
79a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[1][1] == 4); // expected-warning{{TRUE}}
80a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[2][0] == 5); // expected-warning{{TRUE}}
81a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[2][1] == 0); // expected-warning{{TRUE}}
82a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[3][0] == 0); // expected-warning{{TRUE}}
83a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr5[3][1] == 0); // expected-warning{{TRUE}}
8498a95d48SDenys Petrov }
8598a95d48SDenys Petrov
glob_ptr_index2()8698a95d48SDenys Petrov void glob_ptr_index2() {
8798a95d48SDenys Petrov int const *ptr = glob_arr5[1];
88*f0bc7d24SDenys Petrov clang_analyzer_eval(ptr[0] == 3); // expected-warning{{TRUE}}
89*f0bc7d24SDenys Petrov clang_analyzer_eval(ptr[1] == 4); // expected-warning{{TRUE}}
90*f0bc7d24SDenys Petrov clang_analyzer_eval(ptr[2] == 5); // expected-warning{{UNDEFINED}}
91*f0bc7d24SDenys Petrov clang_analyzer_eval(ptr[3] == 0); // expected-warning{{UNDEFINED}}
92*f0bc7d24SDenys Petrov clang_analyzer_eval(ptr[4] == 0); // expected-warning{{UNDEFINED}}
9398a95d48SDenys Petrov }
9498a95d48SDenys Petrov
glob_invalid_index5()9598a95d48SDenys Petrov void glob_invalid_index5() {
9698a95d48SDenys Petrov int idx = -42;
97a12bfac2SDenys Petrov auto x = glob_arr5[1][idx]; // expected-warning{{garbage or undefined}}
9898a95d48SDenys Petrov }
9998a95d48SDenys Petrov
glob_invalid_index6()10098a95d48SDenys Petrov void glob_invalid_index6() {
10198a95d48SDenys Petrov int const *ptr = &glob_arr5[1][0];
10298a95d48SDenys Petrov int idx = 42;
103*f0bc7d24SDenys Petrov auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
10498a95d48SDenys Petrov }
10544e803efSDenys Petrov
10644e803efSDenys Petrov extern const int glob_arr_no_init[10];
glob_array_index4()10744e803efSDenys Petrov void glob_array_index4() {
10844e803efSDenys Petrov clang_analyzer_eval(glob_arr_no_init[2]); // expected-warning{{UNKNOWN}}
10944e803efSDenys Petrov }
11044e803efSDenys Petrov
11144e803efSDenys Petrov struct S2 {
11244e803efSDenys Petrov static const int arr_no_init[10];
11344e803efSDenys Petrov };
struct_arr_index1()11444e803efSDenys Petrov void struct_arr_index1() {
11544e803efSDenys Petrov clang_analyzer_eval(S2::arr_no_init[2]); // expected-warning{{UNKNOWN}}
11644e803efSDenys Petrov }
1171deccd05SDenys Petrov
1181deccd05SDenys Petrov char const glob_arr6[5] = "123";
glob_array_index5()1191deccd05SDenys Petrov void glob_array_index5() {
1201deccd05SDenys Petrov clang_analyzer_eval(glob_arr6[0] == '1'); // expected-warning{{TRUE}}
1211deccd05SDenys Petrov clang_analyzer_eval(glob_arr6[1] == '2'); // expected-warning{{TRUE}}
1221deccd05SDenys Petrov clang_analyzer_eval(glob_arr6[2] == '3'); // expected-warning{{TRUE}}
1231deccd05SDenys Petrov clang_analyzer_eval(glob_arr6[3] == '\0'); // expected-warning{{TRUE}}
1241deccd05SDenys Petrov clang_analyzer_eval(glob_arr6[4] == '\0'); // expected-warning{{TRUE}}
1251deccd05SDenys Petrov }
1261deccd05SDenys Petrov
glob_ptr_index3()1271deccd05SDenys Petrov void glob_ptr_index3() {
1281deccd05SDenys Petrov char const *ptr = glob_arr6;
1291deccd05SDenys Petrov clang_analyzer_eval(ptr[-42] == '\0'); // expected-warning{{UNDEFINED}}
1301deccd05SDenys Petrov clang_analyzer_eval(ptr[0] == '1'); // expected-warning{{TRUE}}
1311deccd05SDenys Petrov clang_analyzer_eval(ptr[1] == '2'); // expected-warning{{TRUE}}
1321deccd05SDenys Petrov clang_analyzer_eval(ptr[2] == '3'); // expected-warning{{TRUE}}
1331deccd05SDenys Petrov clang_analyzer_eval(ptr[3] == '\0'); // expected-warning{{TRUE}}
1341deccd05SDenys Petrov clang_analyzer_eval(ptr[4] == '\0'); // expected-warning{{TRUE}}
1351deccd05SDenys Petrov clang_analyzer_eval(ptr[5] == '\0'); // expected-warning{{UNDEFINED}}
1361deccd05SDenys Petrov clang_analyzer_eval(ptr[6] == '\0'); // expected-warning{{UNDEFINED}}
1371deccd05SDenys Petrov }
1381deccd05SDenys Petrov
glob_invalid_index7()1391deccd05SDenys Petrov void glob_invalid_index7() {
1401deccd05SDenys Petrov int idx = -42;
1411deccd05SDenys Petrov auto x = glob_arr6[idx]; // expected-warning{{garbage or undefined}}
1421deccd05SDenys Petrov }
1431deccd05SDenys Petrov
glob_invalid_index8()1441deccd05SDenys Petrov void glob_invalid_index8() {
1451deccd05SDenys Petrov const char *ptr = glob_arr6;
1461deccd05SDenys Petrov int idx = 42;
1471deccd05SDenys Petrov auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
1481deccd05SDenys Petrov }
1491deccd05SDenys Petrov
1501deccd05SDenys Petrov char const glob_arr7[5] = {"123"};
glob_array_index6()1511deccd05SDenys Petrov void glob_array_index6() {
1521deccd05SDenys Petrov clang_analyzer_eval(glob_arr7[0] == '1'); // expected-warning{{TRUE}}
1531deccd05SDenys Petrov clang_analyzer_eval(glob_arr7[1] == '2'); // expected-warning{{TRUE}}
1541deccd05SDenys Petrov clang_analyzer_eval(glob_arr7[2] == '3'); // expected-warning{{TRUE}}
1551deccd05SDenys Petrov clang_analyzer_eval(glob_arr7[3] == '\0'); // expected-warning{{TRUE}}
1561deccd05SDenys Petrov clang_analyzer_eval(glob_arr7[4] == '\0'); // expected-warning{{TRUE}}
1571deccd05SDenys Petrov }
1581deccd05SDenys Petrov
glob_invalid_index9()1591deccd05SDenys Petrov void glob_invalid_index9() {
1601deccd05SDenys Petrov int idx = -42;
1611deccd05SDenys Petrov auto x = glob_arr7[idx]; // expected-warning{{garbage or undefined}}
1621deccd05SDenys Petrov }
1631deccd05SDenys Petrov
glob_invalid_index10()1641deccd05SDenys Petrov void glob_invalid_index10() {
1651deccd05SDenys Petrov const char *ptr = glob_arr7;
1661deccd05SDenys Petrov int idx = 42;
1671deccd05SDenys Petrov auto x = ptr[idx]; // expected-warning{{garbage or undefined}}
1681deccd05SDenys Petrov }
1691deccd05SDenys Petrov
1701deccd05SDenys Petrov char const *const glob_ptr8 = "123";
glob_ptr_index4()1711deccd05SDenys Petrov void glob_ptr_index4() {
1721deccd05SDenys Petrov clang_analyzer_eval(glob_ptr8[0] == '1'); // expected-warning{{TRUE}}
1731deccd05SDenys Petrov clang_analyzer_eval(glob_ptr8[1] == '2'); // expected-warning{{TRUE}}
1741deccd05SDenys Petrov clang_analyzer_eval(glob_ptr8[2] == '3'); // expected-warning{{TRUE}}
1751deccd05SDenys Petrov clang_analyzer_eval(glob_ptr8[3] == '\0'); // expected-warning{{TRUE}}
1761deccd05SDenys Petrov // FIXME: Should be UNDEFINED.
1771deccd05SDenys Petrov // We should take into account a declaration in which the literal is used.
1781deccd05SDenys Petrov clang_analyzer_eval(glob_ptr8[4] == '\0'); // expected-warning{{TRUE}}
1791deccd05SDenys Petrov }
1801deccd05SDenys Petrov
glob_invalid_index11()1811deccd05SDenys Petrov void glob_invalid_index11() {
1821deccd05SDenys Petrov int idx = -42;
1831deccd05SDenys Petrov auto x = glob_ptr8[idx]; // expected-warning{{garbage or undefined}}
1841deccd05SDenys Petrov }
1851deccd05SDenys Petrov
glob_invalid_index12()1861deccd05SDenys Petrov void glob_invalid_index12() {
1871deccd05SDenys Petrov int idx = 42;
1881deccd05SDenys Petrov // FIXME: Should warn {{garbage or undefined}}
1891deccd05SDenys Petrov // We should take into account a declaration in which the literal is used.
1901deccd05SDenys Petrov auto x = glob_ptr8[idx]; // no-warning
1911deccd05SDenys Petrov }
1921deccd05SDenys Petrov
1931deccd05SDenys Petrov const char16_t *const glob_ptr9 = u"абв";
glob_ptr_index5()1941deccd05SDenys Petrov void glob_ptr_index5() {
1951deccd05SDenys Petrov clang_analyzer_eval(glob_ptr9[0] == u'а'); // expected-warning{{TRUE}}
1961deccd05SDenys Petrov clang_analyzer_eval(glob_ptr9[1] == u'б'); // expected-warning{{TRUE}}
1971deccd05SDenys Petrov clang_analyzer_eval(glob_ptr9[2] == u'в'); // expected-warning{{TRUE}}
1981deccd05SDenys Petrov clang_analyzer_eval(glob_ptr9[3] == '\0'); // expected-warning{{TRUE}}
1991deccd05SDenys Petrov }
2001deccd05SDenys Petrov
2011deccd05SDenys Petrov const char32_t *const glob_ptr10 = U"\U0001F607\U0001F608\U0001F609";
glob_ptr_index6()2021deccd05SDenys Petrov void glob_ptr_index6() {
2031deccd05SDenys Petrov clang_analyzer_eval(glob_ptr10[0] == U'\U0001F607'); // expected-warning{{TRUE}}
2041deccd05SDenys Petrov clang_analyzer_eval(glob_ptr10[1] == U'\U0001F608'); // expected-warning{{TRUE}}
2051deccd05SDenys Petrov clang_analyzer_eval(glob_ptr10[2] == U'\U0001F609'); // expected-warning{{TRUE}}
2061deccd05SDenys Petrov clang_analyzer_eval(glob_ptr10[3] == '\0'); // expected-warning{{TRUE}}
2071deccd05SDenys Petrov }
2081deccd05SDenys Petrov
2091deccd05SDenys Petrov const wchar_t *const glob_ptr11 = L"\123\u0041\xFF";
glob_ptr_index7()2101deccd05SDenys Petrov void glob_ptr_index7() {
2111deccd05SDenys Petrov clang_analyzer_eval(glob_ptr11[0] == L'\123'); // expected-warning{{TRUE}}
2121deccd05SDenys Petrov clang_analyzer_eval(glob_ptr11[1] == L'\u0041'); // expected-warning{{TRUE}}
2131deccd05SDenys Petrov clang_analyzer_eval(glob_ptr11[2] == L'\xFF'); // expected-warning{{TRUE}}
2141deccd05SDenys Petrov clang_analyzer_eval(glob_ptr11[3] == L'\0'); // expected-warning{{TRUE}}
2151deccd05SDenys Petrov }
2161deccd05SDenys Petrov
2171deccd05SDenys Petrov const char *const glob_ptr12 = u8"abc";
glob_ptr_index8()2181deccd05SDenys Petrov void glob_ptr_index8() {
2191deccd05SDenys Petrov clang_analyzer_eval(glob_ptr12[0] == 'a'); // expected-warning{{TRUE}}
2201deccd05SDenys Petrov clang_analyzer_eval(glob_ptr12[1] == 'b'); // expected-warning{{TRUE}}
2211deccd05SDenys Petrov clang_analyzer_eval(glob_ptr12[2] == 'c'); // expected-warning{{TRUE}}
2221deccd05SDenys Petrov clang_analyzer_eval(glob_ptr12[3] == '\0'); // expected-warning{{TRUE}}
2231deccd05SDenys Petrov }
224a12bfac2SDenys Petrov
225a12bfac2SDenys Petrov typedef int Int;
226a12bfac2SDenys Petrov typedef Int const CInt;
227a12bfac2SDenys Petrov typedef CInt Arr[2];
228a12bfac2SDenys Petrov typedef Arr Arr2[4];
229a12bfac2SDenys Petrov Arr2 glob_arr8 = {{1}, 3, 4, 5}; // const int[4][2]
glob_array_typedef1()230a12bfac2SDenys Petrov void glob_array_typedef1() {
231a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[0][0] == 1); // expected-warning{{TRUE}}
232a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[0][1] == 0); // expected-warning{{TRUE}}
233a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[1][0] == 3); // expected-warning{{TRUE}}
234a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[1][1] == 4); // expected-warning{{TRUE}}
235a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[2][0] == 5); // expected-warning{{TRUE}}
236a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[2][1] == 0); // expected-warning{{TRUE}}
237a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[3][0] == 0); // expected-warning{{TRUE}}
238a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr8[3][1] == 0); // expected-warning{{TRUE}}
239a12bfac2SDenys Petrov }
240a12bfac2SDenys Petrov
241a12bfac2SDenys Petrov const int glob_arr9[2][4] = {{(1), 2, ((3)), 4}, 5, 6, (((7)))};
glob_array_parentheses1()242a12bfac2SDenys Petrov void glob_array_parentheses1() {
243a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[0][0] == 1); // expected-warning{{TRUE}}
244a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[0][1] == 2); // expected-warning{{TRUE}}
245a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[0][2] == 3); // expected-warning{{TRUE}}
246a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[0][3] == 4); // expected-warning{{TRUE}}
247a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[1][0] == 5); // expected-warning{{TRUE}}
248a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[1][1] == 6); // expected-warning{{TRUE}}
249a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[1][2] == 7); // expected-warning{{TRUE}}
250a12bfac2SDenys Petrov clang_analyzer_eval(glob_arr9[1][3] == 0); // expected-warning{{TRUE}}
251a12bfac2SDenys Petrov }
252