On Wednesday 19 November 2025 15:59:05 Martin Storsjö wrote:
> On Sat, 15 Nov 2025, Pali Rohár wrote:
> 
> > OS system msvcrt40.dll and msvcrt.dll libraries since Windows Vista, UCRT
> > library, versioned msvcr80.dll libraries and new have semi-broken _assert()
> > function which do not print anything to stderr in case the stderr FILE*
> > stream was set to translated UTF-8/UTF-16 mode (_O_U8TEXT or _O_U16TEXT or
> > _O_U16TEXT). This is because _assert() function is using fprintf() for
> > writing to stderr and it is limitation of fprintf() function that it does
> > not work on streams configured in one of those modes. Only fwprintf()
> > function can be used on FILE* stream in that mode. Add a workaround for
> > _assert() function. Implement a small mingw-w64 wrapper around the DLL
> > _assert() function and change mode to _O_TEXT before calling _assert().
> > Import symbol name is renamed to __msvcrt_assert and in def file is defined
> > with DATA keyword which prevent having function with __msvcrt_assert name.
> > mingw-w64 wrapper calls directly function via its import name.
> > ---
> 
> > diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
> > index acb5f5fb2779..08f48e7de858 100644
> > --- a/mingw-w64-crt/Makefile.am
> > +++ b/mingw-w64-crt/Makefile.am
> > @@ -173,6 +173,7 @@ src_msvcrt_common=\
> >   include/mingw-wchar.h \
> >   misc/__mingw_mbrtowc_cp.c \
> >   misc/__mingw_wcrtomb_cp.c \
> > +  misc/_assert.c \
> >   misc/_onexit.c \
> >   misc/mbrlen.c \
> >   misc/mbrtowc.c \
> > @@ -433,6 +434,7 @@ src_ucrtbase=\
> >   misc/__p__osver_emul.c \
> >   misc/__initenv.c \
> >   misc/__winitenv.c \
> > +  misc/_assert.c \
> >   misc/_onexit.c \
> >   misc/output_format.c \
> >   misc/ucrt-access.c \
> 
> When this function is inserted in every crt library, can't we just add it to
> libmingwex.a, which reduces the amount of extra copies of it that we end up
> compiling? Or is there anything CRT specific in it?

There is nothing CRT specific. I was just thinking that this change is
not required for crtdll and msvcrt20 which do not support those
translated UTF-8/UTF-16 mode, and can use the native _assert symbol.
But that would complicate build process, so I put this wrapper for all
CRT libraries. And I forgot that I could move it into libmingwex.a.

So when you are applying this change, feel free to move the _assert.c in
mingwex section in Makefile.am file.

> Other than that, this looks ok - complicated, but probably relevant, since
> it's important to get assert messages visible despite such stdio modes.
> 
> It's nice that you managed to make a testcase for this!
> 
> // Martin

The test is quite tricky and I'm not sure if it would not break in
future. But I copied the idea of dup2 and _spawnvp directly from msvc
_pipe documentation, part Example 2:
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/pipe?view=msvc-170#example-2


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to