[PATCH] D111542: [analyzer] Retrieve incomplete array extent from its redeclaration.
Denys Petrov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 20 06:46:06 PDT 2021
ASDenysPetrov updated this revision to Diff 380936.
ASDenysPetrov added a comment.
Fixed redefinition in test file initialization.cpp.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111542/new/
https://reviews.llvm.org/D111542
Files:
clang/lib/StaticAnalyzer/Core/RegionStore.cpp
clang/test/Analysis/initialization.c
Index: clang/test/Analysis/initialization.c
===================================================================
--- clang/test/Analysis/initialization.c
+++ clang/test/Analysis/initialization.c
@@ -102,3 +102,42 @@
void glob_arr_index4() {
clang_analyzer_eval(glob_arr_no_init[2]); // expected-warning{{UNKNOWN}}
}
+
+const int glob_arr3[]; // IncompleteArrayType
+const int glob_arr3[4] = {1, 2, 3}; // ConstantArrayType
+void glob_arr_index5() {
+ clang_analyzer_eval(glob_arr3[0] == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval(glob_arr3[1] == 2); // expected-warning{{TRUE}}
+ clang_analyzer_eval(glob_arr3[2] == 3); // expected-warning{{TRUE}}
+ clang_analyzer_eval(glob_arr3[3] == 0); // expected-warning{{TRUE}}
+}
+
+void glob_invalid_index5() {
+ int x = 42;
+ int res = glob_arr3[x]; // expected-warning{{garbage or undefined}}
+}
+
+void glob_invalid_index6() {
+ int x = -42;
+ int res = glob_arr3[x]; // expected-warning{{garbage or undefined}}
+}
+
+const int glob_arr4[]; // IncompleteArrayType
+const int glob_arr4[4] = {1, 2, 3}; // ConstantArrayType
+const int glob_arr4[]; // ConstantArrayType (according to AST)
+void glob_arr_index6() {
+ clang_analyzer_eval(glob_arr4[0] == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval(glob_arr4[1] == 2); // expected-warning{{TRUE}}
+ clang_analyzer_eval(glob_arr4[2] == 3); // expected-warning{{TRUE}}
+ clang_analyzer_eval(glob_arr4[3] == 0); // expected-warning{{TRUE}}
+}
+
+void glob_invalid_index7() {
+ int x = 42;
+ int res = glob_arr4[x]; // expected-warning{{garbage or undefined}}
+}
+
+void glob_invalid_index8() {
+ int x = -42;
+ int res = glob_arr4[x]; // expected-warning{{garbage or undefined}}
+}
Index: clang/lib/StaticAnalyzer/Core/RegionStore.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/RegionStore.cpp
+++ clang/lib/StaticAnalyzer/Core/RegionStore.cpp
@@ -1641,8 +1641,14 @@
(!B.isMainAnalysis() || !VD->hasGlobalStorage()))
return None;
- // Array's declaration should have an initializer.
- const Expr *Init = VD->getAnyInitializer();
+ // Array's declaration should have `ConstantArrayType` type, because only this
+ // type contains an array extent. It may happen that array type can be of
+ // `IncompleteArrayType` type. To get the declaration of `ConstantArrayType`
+ // type, we should find the declaration in the redeclarations chain that has
+ // the initialization expression.
+ // NOTE: `VD` is always non-null if `Init` is non-null, so we can check for
+ // null only one of them.
+ const Expr *Init = VD->getAnyInitializer(VD);
if (!Init)
return None;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111542.380936.patch
Type: text/x-patch
Size: 2718 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211020/573afa19/attachment.bin>
More information about the cfe-commits
mailing list