On 8 Dec 2024, at 11:10, Simon Martin wrote:

> Hi Richard,
>
> On 8 Dec 2024, at 10:27, Richard Biener wrote:
>
>> On Sat, Dec 7, 2024 at 9:29 PM Simon Martin <si...@nasilyan.com>
>> wrote:
>>>
>>> The following valid code triggers an ICE with -fsanitize=address
>>>
>>> === cut here ===
>>> void l() {
>>>     auto const ints = {0,1,2,3,4,5};
>>>     for (auto i : { 3 } ) {
>>>         __builtin_printf("%d ", i);
>>>     }
>>> }
>>> === cut here ===
>>>
>>> The problem is that honor_protect_cleanup_actions does not expect the
>
>>> cleanup sequence of a GIMPLE_TRY_FINALLY to be empty. It is however
>>> the
>>> case here since r14-8681-gceb242f5302027, because lower_stmt removes
>>> the
>>> only statement in the sequence: a ASAN_MARK statement for the array
>>> that
>>> backs the initializer_list).
>>>
>>> This patch simply checks that the finally block is not 0 before
>>> accessing it in honor_protect_cleanup_actions.
>>>
>>> Successfully tested on x86_64-pc-linux-gnu. OK for trunk and gcc-14?
>>>
>>>         PR c++/117845
>>>
>>> gcc/ChangeLog:
>>>
>>>         * tree-eh.cc (honor_protect_cleanup_actions): Support empty
>>>         finally sequences.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>>         * g++.dg/asan/pr117845-2.C: New test.
>>>         * g++.dg/asan/pr117845.C: New test.
>>>
>>> ---
>>>  gcc/testsuite/g++.dg/asan/pr117845-2.C | 12 ++++++++++++
>>>  gcc/testsuite/g++.dg/asan/pr117845.C   | 12 ++++++++++++
>>>  gcc/tree-eh.cc                         |  3 ++-
>>>  3 files changed, 26 insertions(+), 1 deletion(-)
>>>  create mode 100644 gcc/testsuite/g++.dg/asan/pr117845-2.C
>>>  create mode 100644 gcc/testsuite/g++.dg/asan/pr117845.C
>>>
>>> diff --git a/gcc/testsuite/g++.dg/asan/pr117845-2.C
>>> b/gcc/testsuite/g++.dg/asan/pr117845-2.C
>>> new file mode 100644
>>> index 00000000000..c0556397009
>>> --- /dev/null
>>> +++ b/gcc/testsuite/g++.dg/asan/pr117845-2.C
>>> @@ -0,0 +1,12 @@
>>> +// PR c++/117845 - Actually valid variant
>>> +// { dg-do "compile" }
>>> +// { dg-options "-fsanitize=address" }
>>> +
>>> +#include <initializer_list>
>>> +
>>> +void l() {
>>> +    auto const ints = {0,1,2,3,4,5};
>>> +    for (auto i : { 3 } ) {
>>> +        __builtin_printf("%d ", i);
>>> +    }
>>> +}
>>> diff --git a/gcc/testsuite/g++.dg/asan/pr117845.C
>>> b/gcc/testsuite/g++.dg/asan/pr117845.C
>>> new file mode 100644
>>> index 00000000000..d90d351e270
>>> --- /dev/null
>>> +++ b/gcc/testsuite/g++.dg/asan/pr117845.C
>>> @@ -0,0 +1,12 @@
>>> +// PR c++/117845 - Initially reported case.
>>> +// { dg-do "compile" }
>>> +// { dg-options "-fsanitize=address" }
>>> +
>>> +#include <initializer_list>
>>> +
>>> +void l() {
>>> +    auto const ints = {0,1,2,3,4,5};
>>> +    for (int i : ints | h) { // { dg-error "was not declared" }
>>> +        __builtin_printf("%d ", i);
>>> +    }
>>> +}
>>> diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
>>> index 769785fad2b..dc920de9b38 100644
>>> --- a/gcc/tree-eh.cc
>>> +++ b/gcc/tree-eh.cc
>>> @@ -1026,7 +1026,8 @@ honor_protect_cleanup_actions (struct leh_state
>>> *outer_state,
>>>          MUST_NOT_THROW filter.  */
>>>        gimple_stmt_iterator gsi = gsi_start (finally);
>>>        gimple *x = gsi_stmt (gsi);
>>> -      if (gimple_code (x) == GIMPLE_TRY
>>> +      if (x
>>
>> style-wise you should check for gsi_end_p (gsi) before
>> calling gsi_stmt on the iterator.  Implementation-wise
>> your patch has the same effect, of course.
>>
>> Can you still refactor it this way?
> Sure, here’s the updated version that I’m currently testing. Ok for
> trunk and gcc-14 assuming the testing comes back all green?
FYI the testing on x86_64-pc-linux-gnu of the updated patch was successful.

Simon

Reply via email to