public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jonathan Yong <10walls@gmail.com>
To: Matteo Italia <matteo@mitalia.net>,
	gcc-patches@gcc.gnu.org, Liu Hao <lh_mouse@126.com>
Cc: tristan.gingold@cern.ch
Subject: Re: Ping: Re: [PATCH] libgcc: fix SEH C++ rethrow semantics [PR113337]
Date: Wed, 31 Jan 2024 00:08:33 +0000	[thread overview]
Message-ID: <f94af01b-02de-4a3a-bd3d-df40fb734afa@gmail.com> (raw)
In-Reply-To: <6e99ca24-96b1-400b-8df7-3329b71b7dbc@mitalia.net>

On 1/24/24 15:17, Matteo Italia wrote:
> Ping! That's a one-line fix, and you can find all the details in the 
> bugzilla entry. Also, I can provide executables built with the affected 
> toolchains, demonstrating the problem and the fix.
> 
> Thanks,
> Matteo
> 

I was away last week. LH, care to comment? Changes look fine to me.

> Il 17/01/24 12:51, Matteo Italia ha scritto:
>> SEH _Unwind_Resume_or_Rethrow invokes abort directly if
>> _Unwind_RaiseException doesn't manage to find a handler for the rethrown
>> exception; this is incorrect, as in this case std::terminate should be
>> invoked, allowing an application-provided terminate handler to handle
>> the situation instead of straight crashing the application through
>> abort.
>>
>> The bug can be demonstrated with this simple test case:
>> ===
>> static void custom_terminate_handler() {
>>      fprintf(stderr, "custom_terminate_handler invoked\n");
>>      std::exit(1);
>> }
>>
>> int main(int argc, char *argv[]) {
>>      std::set_terminate(&custom_terminate_handler);
>>      if (argc < 2) return 1;
>>      const char *mode = argv[1];
>>      fprintf(stderr, "%s\n", mode);
>>      if (strcmp(mode, "throw") == 0) {
>>          throw std::exception();
>>      } else if (strcmp(mode, "rethrow") == 0) {
>>          try {
>>              throw std::exception();
>>          } catch (...) {
>>              throw;
>>          }
>>      } else {
>>          return 1;
>>      }
>>      return 0;
>> }
>> ===
>>
>> On all gcc builds with non-SEH exceptions, this will print
>> "custom_terminate_handler invoked" both if launched as ./a.out throw or
>> as ./a.out rethrow, on SEH builds instead if will work as expected only
>> with ./a.exe throw, but will crash with the "built-in" abort message
>> with ./a.exe rethrow.
>>
>> This patch fixes the problem, forwarding back the error code to the
>> caller (__cxa_rethrow), that calls std::terminate if
>> _Unwind_Resume_or_Rethrow returns.
>>
>> The change makes the code path coherent with SEH _Unwind_RaiseException,
>> and with the generic _Unwind_Resume_or_Rethrow from libgcc/unwind.inc
>> (used for SjLj and Dw2 exception backend).
>>
>> libgcc/ChangeLog:
>>
>>          * unwind-seh.c (_Unwind_Resume_or_Rethrow): forward
>>          _Unwind_RaiseException return code back to caller instead of
>>          calling abort, allowing __cxa_rethrow to invoke std::terminate
>>          in case of uncaught rethrown exception
>> ---
>>   libgcc/unwind-seh.c | 6 +++---
>>   1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/libgcc/unwind-seh.c b/libgcc/unwind-seh.c
>> index 8ef0257b616..f1b8f5a8519 100644
>> --- a/libgcc/unwind-seh.c
>> +++ b/libgcc/unwind-seh.c
>> @@ -395,9 +395,9 @@ _Unwind_Reason_Code
>>   _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc)
>>   {
>>     if (exc->private_[0] == 0)
>> -    _Unwind_RaiseException (exc);
>> -  else
>> -    _Unwind_ForcedUnwind_Phase2 (exc);
>> +    return _Unwind_RaiseException (exc);
>> +
>> +  _Unwind_ForcedUnwind_Phase2 (exc);
>>     abort ();
>>   }


  reply	other threads:[~2024-01-31  0:08 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-17 11:51 Matteo Italia
2024-01-24 15:17 ` Ping: " Matteo Italia
2024-01-31  0:08   ` Jonathan Yong [this message]
2024-01-31  3:24     ` LIU Hao
2024-02-05 11:53       ` Matteo Italia
2024-02-06  5:31         ` NightStrike
2024-02-06  9:17           ` Jonathan Yong
2024-02-07  9:22             ` Matteo Italia
2024-02-26  1:41               ` NightStrike
2024-02-26 12:12                 ` Matteo Italia

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f94af01b-02de-4a3a-bd3d-df40fb734afa@gmail.com \
    --to=10walls@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=lh_mouse@126.com \
    --cc=matteo@mitalia.net \
    --cc=tristan.gingold@cern.ch \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).