aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2024-07-11 15:57:43 -0400
committerMarek Polacek <polacek@redhat.com>2024-07-18 10:39:25 -0400
commit1e60a6abfece40c7bf55d6ca0a439078d3f5159a (patch)
tree94dc6edcfcd2c461825b16bbdfa810d96313b496
parent5080840d8fbf25a321dd27543a1462d393d338bc (diff)
downloadgcc-1e60a6abfece40c7bf55d6ca0a439078d3f5159a.zip
gcc-1e60a6abfece40c7bf55d6ca0a439078d3f5159a.tar.gz
gcc-1e60a6abfece40c7bf55d6ca0a439078d3f5159a.tar.bz2
eh: ICE with std::initializer_list and ASan [PR115865]
Here we ICE with -fsanitize=address on std::initializer_list x = { 1, 2, 3 }; since r14-8681, which removed .ASAN_MARK calls on TREE_STATIC variables. That means that lower_try_finally now instead of try { .ASAN_MARK (UNPOISON, &C.0, 12); x = {}; x._M_len = 3; x._M_array = &C.0; } finally { .ASAN_MARK (POISON, &C.0, 12); } gets: try { x = {}; x._M_len = 3; x._M_array = &C.0; } finally { } and we ICE on the empty finally in lower_try_finally_onedest while getting get_eh_else. PR c++/115865 gcc/ChangeLog: * tree-eh.cc (get_eh_else): Check that the result of gimple_seq_first_stmt is non-null. gcc/testsuite/ChangeLog: * g++.dg/asan/initlist2.C: New test. Co-authored-by: Jakub Jelinek <jakub@redhat.com>
-rw-r--r--gcc/testsuite/g++.dg/asan/initlist2.C16
-rw-r--r--gcc/tree-eh.cc2
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.dg/asan/initlist2.C b/gcc/testsuite/g++.dg/asan/initlist2.C
new file mode 100644
index 0000000..bce5410
--- /dev/null
+++ b/gcc/testsuite/g++.dg/asan/initlist2.C
@@ -0,0 +1,16 @@
+// PR c++/115865
+// { dg-do compile }
+// { dg-options "-fsanitize=address" }
+
+typedef decltype(sizeof(char)) size_t;
+
+namespace std {
+template <class> class initializer_list {
+ int *_M_array;
+ size_t _M_len;
+};
+}
+
+int main() {
+ std::initializer_list x = { 1, 2, 3 };
+}
diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
index a776ad5..9609bdc 100644
--- a/gcc/tree-eh.cc
+++ b/gcc/tree-eh.cc
@@ -950,7 +950,7 @@ static inline geh_else *
get_eh_else (gimple_seq finally)
{
gimple *x = gimple_seq_first_stmt (finally);
- if (gimple_code (x) == GIMPLE_EH_ELSE)
+ if (x && gimple_code (x) == GIMPLE_EH_ELSE)
{
gcc_assert (gimple_seq_singleton_p (finally));
return as_a <geh_else *> (x);