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>
(cherry picked from commit 1e60a6abfece40c7bf55d6ca0a439078d3f5159a)
This commit is contained in:
Marek Polacek 2024-07-11 15:57:43 -04:00
parent 747c4b5857
commit 493035c878
2 changed files with 17 additions and 1 deletions

View file

@ -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 };
}

View file

@ -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);