[PATCH] D107073: [analyzer] Disable direct binding from list initialization for constant arrays of local storage duration.
ASDenysPetrov abandoned this revision. ASDenysPetrov added a comment. This patch is currently irrelevant after last changes in the parent revision. It's going to be reworked or permanently abandoned. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107073/new/ https://reviews.llvm.org/D107073 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D107073: [analyzer] Disable direct binding from list initialization for constant arrays of local storage duration.
ASDenysPetrov updated this revision to Diff 366081. ASDenysPetrov added a comment. Rebased. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107073/new/ https://reviews.llvm.org/D107073 Files: clang/lib/StaticAnalyzer/Core/RegionStore.cpp clang/test/Analysis/initialization.c clang/test/Analysis/initialization.cpp Index: clang/test/Analysis/initialization.cpp === --- clang/test/Analysis/initialization.cpp +++ clang/test/Analysis/initialization.cpp @@ -167,7 +167,7 @@ clang_analyzer_eval(glob_arr3[3][1] == 0); // expected-warning{{TRUE}} } -void negative_index1() { +void glob_arr_negative_index1() { int x = 2, y = -2; clang_analyzer_eval(glob_arr3[x][y] == 3); // expected-warning{{TRUE}} x = 4; @@ -175,12 +175,12 @@ clang_analyzer_eval(glob_arr3[x][y] == 7); // expected-warning{{TRUE}} } -void out_of_bound_index1() { +void glob_arr_out_of_bound_index1() { int x = -3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index2() { +void glob_arr_out_of_bound_index2() { int x = 3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } @@ -197,12 +197,101 @@ clang_analyzer_eval(glob_arr4[7] == 0); // expected-warning{{TRUE}} } -void out_of_bound_index3() { +void glob_arr_out_of_bound_index3() { int x = -42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index4() { +void glob_arr_out_of_bound_index4() { int x = 42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } + +void local_arr_index1() { + const int local_arr[2][2][3] = {{{1, 2}}, {{7}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 0); // expected-warning{{TRUE}} +} + +void local_arr_index2() { + int const local_arr[2][2][3] = {{{1, 2}, {}}, {{7, 8}, {10, 11, 12}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 10); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 11); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 12); // expected-warning{{TRUE}} +} + +void local_arr_index3() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + clang_analyzer_eval(local_arr[0][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0] == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][1] == 0); // expected-warning{{TRUE}} +} + +void local_arr_negative_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 2, y = -2; + clang_analyzer_eval(local_arr[x][y] == 3); // expected-warning{{TRUE}} + x = 4; + y = -2; + clang_analyzer_eval(local_arr[x][y] == 7); // expected-warning{{TRUE}} +} + +void local_arr_out_of_bound_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = -3, y = 2; + int res = local_arr[x][y]; // expected-warning{{garbage or undefined}} +} + +void local_arr_out_of_bound_index2() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 3, y = 2; + int res = local_arr[x][y];
[PATCH] D107073: [analyzer] Disable direct binding from list initialization for constant arrays of local storage duration.
ASDenysPetrov updated this revision to Diff 363869. ASDenysPetrov added a comment. Fixed clang-tidy complaints. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107073/new/ https://reviews.llvm.org/D107073 Files: clang/lib/StaticAnalyzer/Core/RegionStore.cpp clang/test/Analysis/initialization.c clang/test/Analysis/initialization.cpp Index: clang/test/Analysis/initialization.cpp === --- clang/test/Analysis/initialization.cpp +++ clang/test/Analysis/initialization.cpp @@ -167,7 +167,7 @@ clang_analyzer_eval(glob_arr3[3][1] == 0); // expected-warning{{TRUE}} } -void negative_index1() { +void glob_arr_negative_index1() { int x = 2, y = -2; clang_analyzer_eval(glob_arr3[x][y] == 3); // expected-warning{{TRUE}} x = 4; @@ -175,12 +175,12 @@ clang_analyzer_eval(glob_arr3[x][y] == 7); // expected-warning{{TRUE}} } -void out_of_bound_index1() { +void glob_arr_out_of_bound_index1() { int x = -3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index2() { +void glob_arr_out_of_bound_index2() { int x = 3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } @@ -197,12 +197,101 @@ clang_analyzer_eval(glob_arr4[7] == 0); // expected-warning{{TRUE}} } -void out_of_bound_index3() { +void glob_arr_out_of_bound_index3() { int x = -42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index4() { +void glob_arr_out_of_bound_index4() { int x = 42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } + +void local_arr_index1() { + const int local_arr[2][2][3] = {{{1, 2}}, {{7}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 0); // expected-warning{{TRUE}} +} + +void local_arr_index2() { + int const local_arr[2][2][3] = {{{1, 2}, {}}, {{7, 8}, {10, 11, 12}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 10); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 11); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 12); // expected-warning{{TRUE}} +} + +void local_arr_index3() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + clang_analyzer_eval(local_arr[0][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0] == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][1] == 0); // expected-warning{{TRUE}} +} + +void local_arr_negative_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 2, y = -2; + clang_analyzer_eval(local_arr[x][y] == 3); // expected-warning{{TRUE}} + x = 4; + y = -2; + clang_analyzer_eval(local_arr[x][y] == 7); // expected-warning{{TRUE}} +} + +void local_arr_out_of_bound_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = -3, y = 2; + int res = local_arr[x][y]; // expected-warning{{garbage or undefined}} +} + +void local_arr_out_of_bound_index2() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 3, y = 2; + int
[PATCH] D107073: [analyzer] Disable direct binding from list initialization for constant arrays of local storage duration.
ASDenysPetrov updated this revision to Diff 363677. ASDenysPetrov added a comment. Refined code a bit. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107073/new/ https://reviews.llvm.org/D107073 Files: clang/lib/StaticAnalyzer/Core/RegionStore.cpp clang/test/Analysis/initialization.c clang/test/Analysis/initialization.cpp Index: clang/test/Analysis/initialization.cpp === --- clang/test/Analysis/initialization.cpp +++ clang/test/Analysis/initialization.cpp @@ -167,7 +167,7 @@ clang_analyzer_eval(glob_arr3[3][1] == 0); // expected-warning{{TRUE}} } -void negative_index1() { +void glob_arr_negative_index1() { int x = 2, y = -2; clang_analyzer_eval(glob_arr3[x][y] == 3); // expected-warning{{TRUE}} x = 4; @@ -175,12 +175,12 @@ clang_analyzer_eval(glob_arr3[x][y] == 7); // expected-warning{{TRUE}} } -void out_of_bound_index1() { +void glob_arr_out_of_bound_index1() { int x = -3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index2() { +void glob_arr_out_of_bound_index2() { int x = 3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } @@ -197,12 +197,101 @@ clang_analyzer_eval(glob_arr4[7] == 0); // expected-warning{{TRUE}} } -void out_of_bound_index3() { +void glob_arr_out_of_bound_index3() { int x = -42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index4() { +void glob_arr_out_of_bound_index4() { int x = 42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } + +void local_arr_index1() { + const int local_arr[2][2][3] = {{{1, 2}}, {{7}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 0); // expected-warning{{TRUE}} +} + +void local_arr_index2() { + int const local_arr[2][2][3] = {{{1, 2}, {}}, {{7, 8}, {10, 11, 12}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 10); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 11); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 12); // expected-warning{{TRUE}} +} + +void local_arr_index3() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + clang_analyzer_eval(local_arr[0][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0] == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][1] == 0); // expected-warning{{TRUE}} +} + +void local_arr_negative_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 2, y = -2; + clang_analyzer_eval(local_arr[x][y] == 3); // expected-warning{{TRUE}} + x = 4; + y = -2; + clang_analyzer_eval(local_arr[x][y] == 7); // expected-warning{{TRUE}} +} + +void local_arr_out_of_bound_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = -3, y = 2; + int res = local_arr[x][y]; // expected-warning{{garbage or undefined}} +} + +void local_arr_out_of_bound_index2() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 3, y = 2; + int res =
[PATCH] D107073: [analyzer] Disable direct binding from list initialization for constant arrays of local storage duration.
ASDenysPetrov updated this revision to Diff 363454. ASDenysPetrov added a comment. Fixed clang-tidy complaints. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107073/new/ https://reviews.llvm.org/D107073 Files: clang/lib/StaticAnalyzer/Core/RegionStore.cpp clang/test/Analysis/initialization.c clang/test/Analysis/initialization.cpp Index: clang/test/Analysis/initialization.cpp === --- clang/test/Analysis/initialization.cpp +++ clang/test/Analysis/initialization.cpp @@ -167,7 +167,7 @@ clang_analyzer_eval(glob_arr3[3][1] == 0); // expected-warning{{TRUE}} } -void negative_index1() { +void glob_arr_negative_index1() { int x = 2, y = -2; clang_analyzer_eval(glob_arr3[x][y] == 3); // expected-warning{{TRUE}} x = 4; @@ -175,12 +175,12 @@ clang_analyzer_eval(glob_arr3[x][y] == 7); // expected-warning{{TRUE}} } -void out_of_bound_index1() { +void glob_arr_out_of_bound_index1() { int x = -3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index2() { +void glob_arr_out_of_bound_index2() { int x = 3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } @@ -197,12 +197,101 @@ clang_analyzer_eval(glob_arr4[7] == 0); // expected-warning{{TRUE}} } -void out_of_bound_index3() { +void glob_arr_out_of_bound_index3() { int x = -42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index4() { +void glob_arr_out_of_bound_index4() { int x = 42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } + +void local_arr_index1() { + const int local_arr[2][2][3] = {{{1, 2}}, {{7}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 0); // expected-warning{{TRUE}} +} + +void local_arr_index2() { + int const local_arr[2][2][3] = {{{1, 2}, {}}, {{7, 8}, {10, 11, 12}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 10); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 11); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 12); // expected-warning{{TRUE}} +} + +void local_arr_index3() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + clang_analyzer_eval(local_arr[0][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0] == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[2][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[3][1] == 0); // expected-warning{{TRUE}} +} + +void local_arr_negative_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 2, y = -2; + clang_analyzer_eval(local_arr[x][y] == 3); // expected-warning{{TRUE}} + x = 4; + y = -2; + clang_analyzer_eval(local_arr[x][y] == 7); // expected-warning{{TRUE}} +} + +void local_arr_out_of_bound_index1() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = -3, y = 2; + int res = local_arr[x][y]; // expected-warning{{garbage or undefined}} +} + +void local_arr_out_of_bound_index2() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + int x = 3, y = 2; + int
[PATCH] D107073: [analyzer] Disable direct binding from list initialization for constant arrays of local storage duration.
ASDenysPetrov created this revision. ASDenysPetrov added reviewers: NoQ, vsavchenko, steakhal, xazax.hun. ASDenysPetrov added a project: clang. Herald added subscribers: manas, martong, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware. ASDenysPetrov requested review of this revision. Herald added a subscriber: cfe-commits. Ignore direct bindings for constant arrays of local storage duration with list initialization. Constant arrays don't change their values during a lifetime. Therefore, we don't have to bind values directly for each array element. Retrieve values from list initialization on-demand as it currently works for arrays of global storage duration (See https://reviews.llvm.org/D106681 for details). Example: `const int arr[42] = {1,2,3,4};`. We can get values directly from list initializaion in any time, no matter whether the array has **global** or **local** storage duration. Previously it works only for **global** arrays. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D107073 Files: clang/lib/StaticAnalyzer/Core/RegionStore.cpp clang/test/Analysis/initialization.c clang/test/Analysis/initialization.cpp Index: clang/test/Analysis/initialization.cpp === --- clang/test/Analysis/initialization.cpp +++ clang/test/Analysis/initialization.cpp @@ -167,7 +167,7 @@ clang_analyzer_eval(glob_arr3[3][1] == 0); // expected-warning{{TRUE}} } -void negative_index1() { +void glob_arr_negative_index1() { int x = 2, y = -2; clang_analyzer_eval(glob_arr3[x][y] == 3); // expected-warning{{TRUE}} x = 4; @@ -175,12 +175,12 @@ clang_analyzer_eval(glob_arr3[x][y] == 7); // expected-warning{{TRUE}} } -void out_of_bound_index1() { +void glob_arr_out_of_bound_index1() { int x = -3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index2() { +void glob_arr_out_of_bound_index2() { int x = 3, y = 2; int res = glob_arr3[x][y]; // expected-warning{{garbage or undefined}} } @@ -197,12 +197,101 @@ clang_analyzer_eval(glob_arr4[7] == 0); // expected-warning{{TRUE}} } -void out_of_bound_index3() { +void glob_arr_out_of_bound_index3() { int x = -42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } -void out_of_bound_index4() { +void glob_arr_out_of_bound_index4() { int x = 42; int res = glob_arr4[x]; // expected-warning{{garbage or undefined}} } + +void local_arr_index1() { + const int local_arr[2][2][3] = {{{1, 2}}, {{7}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 0); // expected-warning{{TRUE}} +} + +void local_arr_index2() { + int const local_arr[2][2][3] = {{{1, 2}, {}}, {{7, 8}, {10, 11, 12}}}; + clang_analyzer_eval(local_arr[0][0][0] == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][1] == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][0] == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][1] == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0][2] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][0] == 10); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][1] == 11); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1][2] == 12); // expected-warning{{TRUE}} +} + +void local_arr_index3() { + const int local_arr[4][2] = {{}, {3}, {}, {7}}; + clang_analyzer_eval(local_arr[0][0] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[0][1] == 0); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][0] == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(local_arr[1][1] == 0); // expected-warning{{TRUE}} +