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 ();
>> }
next prev parent 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).