Feel free to take it. On Monday 08 September 2025 18:47:04 Kirill Makurin wrote: > Tricky but doable. Thanks to Microsoft for complicating things. > > Would you like me to take care of this, or would you prefer to do it yourself? > ________________________________ > From: Pali Rohár <pali.ro...@gmail.com> > Sent: Tuesday, September 9, 2025 3:42 AM > To: Kirill Makurin <maiddais...@outlook.com> > Cc: mingw-w64-public <mingw-w64-public@lists.sourceforge.net> > Subject: Re: Always map assert to _wassert for msvcr80.dll and later? > > Yes, this is also my observation. > > For msvcrt40.dll it would be quite tricky as msvcrt40.dll itself does > not export _wassert. So it would be needed via GetModuleHandleA to get > the msvcrt.dll and call msvcrt's _wassert even for msvcrt40.dll builds. > In case msvcrt.dll is not loaded or does not provide _wassert, then > calling msvcrt40.dll's _assert should be safe. > > On Monday 08 September 2025 18:32:19 Kirill Makurin wrote: > > I see, so all affected CRTs should also have _wassert. Then it should to be > > easy enough to _fix_ _assert. > > ________________________________ > > From: Pali Rohár <pali.ro...@gmail.com> > > Sent: Tuesday, September 9, 2025 3:26 AM > > To: Kirill Makurin <maiddais...@outlook.com> > > Cc: mingw-w64-public <mingw-w64-public@lists.sourceforge.net> > > Subject: Re: Always map assert to _wassert for msvcr80.dll and later? > > > > It looks like that those translation modes were introduced in msvcr80 > > and are not available in older VC++ versions (like msvcr71, 70, 40, ...). > > They were included into msvcrt.dll system os library in some Windows > > version. And because system os msvcrt40.dll just redirects calls to > > system os msvcrt.dll, they may be available also in msvcrt40.dll. > > > > So non-affected should be: crtdll.dll, msvcrt10.dll, msvcrt20.dll, > > msvcr40d.dll, msvcrtd.dll, msvcr70.dll, msvcr70d.dll, msvcr71.dll, > > msvcr71d.dll. > > > > Conditionally affected based-on OS are: msvcrt40.dll and msvcrt.dll. > > > > And all other libs are always affected. > > > > On Monday 08 September 2025 18:04:55 Kirill Makurin wrote: > > > I think this issue will occur in all CRTs which allows to set translation > > > mode to any of _O_{W|U8|U16}TEXT. I mentioned that these translation > > > modes seem to work starting with msvcrt40.dll, so anything other than > > > crtdll.dll, msvcrt10.dll and msvcrt20.dll should be affected. > > > ________________________________ > > > From: Pali Rohár <pali.ro...@gmail.com> > > > Sent: Tuesday, September 9, 2025 2:59 AM > > > To: Kirill Makurin <maiddais...@outlook.com> > > > Cc: mingw-w64-public <mingw-w64-public@lists.sourceforge.net> > > > Subject: Re: Always map assert to _wassert for msvcr80.dll and later? > > > > > > Thanks for info about availability of _wassert. > > > > > > Do you have exact list of CRT DLL libs which have "broken" _assert in > > > this way? I think that it is important to know which CRT DLLs are > > > affected as only based on that we can say what is harder or easier to > > > implement. > > > > > > On Monday 08 September 2025 17:54:48 Kirill Makurin wrote: > > > > Yes, it possible to change assert's behavior with _set_error_mode[1] > > > > functions. > > > > > > > > Keep in mind that native _wassert is only available starting with > > > > msvcr80.dll and in some msvcrt.dll. If we want to do it for all > > > > affected CRTs, for CRTs which do not have _wassert, we probably would > > > > need to provide our version which mimics CRT behavior and takes > > > > _set_error_mode into account. > > > > > > > > Are you sure it is easier to _fix_ _assert? > > > > > > > > [1] > > > > https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/set-error-mode > > > > ________________________________ > > > > From: Pali Rohár <pali.ro...@gmail.com> > > > > Sent: Tuesday, September 9, 2025 2:45 AM > > > > To: Kirill Makurin <maiddais...@outlook.com> > > > > Cc: mingw-w64-public <mingw-w64-public@lists.sourceforge.net> > > > > Subject: Re: Always map assert to _wassert for msvcr80.dll and later? > > > > > > > > assert does not have to print error to console. For GUI applications it > > > > prints error via MessageBox. And the default console output can be > > > > changed to GUI MessageBox also for console application some CRT call > > > > (I do not not right now how is that function called but there is some > > > > option). > > > > > > > > My idea was that _assert replacement would just convert its narrow > > > > strings to wide strings and call _wassert function. > > > > > > > > On Monday 08 September 2025 17:42:10 Kirill Makurin wrote: > > > > > I wonder how many people would call _assert function directly, since > > > > > it is Microsoft-specific stuff. If such usage is a thing, it would > > > > > make sense. > > > > > > > > > > Maybe we could always map assert to _wassert and provide a working > > > > > replacement (for CRTs which do not have it) which prints message > > > > > using fwprintf and calls abort()? > > > > > ________________________________ > > > > > From: Pali Rohár <pali.ro...@gmail.com> > > > > > Sent: Tuesday, September 9, 2025 2:36 AM > > > > > To: Kirill Makurin <maiddais...@outlook.com> > > > > > Cc: mingw-w64-public <mingw-w64-public@lists.sourceforge.net> > > > > > Subject: Re: Always map assert to _wassert for msvcr80.dll and later? > > > > > > > > > > Personally I do not like those #ifdes for specific CRT version in > > > > > header > > > > > files and in past I tried to remove them as many as possible to make > > > > > header files code more cleaner and not dependent on msvcrt vs UCRT > > > > > changes. That is why I rather suggested to "fix" the _assert function, > > > > > so also manual call to _assert function would work (which may be > > > > > useful > > > > > when wrapping assert into custom function and want to propagate > > > > > line/file of the caller). > > > > > > > > > > I do not think that the wchar_t[] vs char[] array size is a problem. > > > > > Assert strings are not such huge. > > > > > > > > > > On Monday 08 September 2025 17:29:19 Kirill Makurin wrote: > > > > > > I did a very quick test and it seems that _O_{U8|U16|W}TEXT > > > > > > translation modes are working starting with msvcrt40.dll, so we > > > > > > shouldn't bother about this being an issue for msvcrt20.dll and > > > > > > older. > > > > > > > > > > > > assert.h already maps assert to _wassert when _UNICODE or UNICODE > > > > > > macros are defined. I think we could just extend this condition to > > > > > > include `__MSVCRT_VERSION__ >= 0x0800 || defined (_UCRT)`, and if > > > > > > we want to do it for msvcrt.dll, `__MSVCRT_VERSION__ == 0x0600`. > > > > > > > > > > > > The only drawback I see is that stored strings will be wchar[] > > > > > > instead of char[], resulting in larger binaries. > > > > > > > > > > > > ________________________________ > > > > > > From: Pali Rohár <pali.ro...@gmail.com> > > > > > > Sent: Tuesday, September 9, 2025 2:15 AM > > > > > > To: Kirill Makurin <maiddais...@outlook.com> > > > > > > Cc: mingw-w64-public <mingw-w64-public@lists.sourceforge.net> > > > > > > Subject: Re: Always map assert to _wassert for msvcr80.dll and > > > > > > later? > > > > > > > > > > > > Now I see that MS documents that _O_U8TEXT does not work together > > > > > > with > > > > > > printf and hence the assert does not print anything when _O_U8TEXT > > > > > > is > > > > > > set on stderr. > > > > > > > > > > > > https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setmode > > > > > > > > > > > > Instead of redirecting the assert via #define to _wassert, I would > > > > > > rather propose to overrride _assert symbol for those affected import > > > > > > libraries and fix it to work also for _O_U8TEXT. > > > > > > > > > > > > On Monday 08 September 2025 19:03:09 Pali Rohár wrote: > > > > > > > Hello, > > > > > > > > > > > > > > This is not problem of assert, but rather of the fprintf which > > > > > > > assert > > > > > > > calls. Same problem can be triggered by using the plain > > > > > > > fprintf(stderr,...) > > > > > > > instead of assert(0). > > > > > > > > > > > > > > So I do not think that it makes sense to remap assert as > > > > > > > basically all > > > > > > > functions which calls fprintf(stderr,...) are affected. > > > > > > > > > > > > > > Is not it just the _O_U8TEXT which is broken? > > > > > > > > > > > > > > On Monday 08 September 2025 15:38:09 Kirill Makurin wrote: > > > > > > > > Consider the following code: > > > > > > > > > > > > > > > > ``` > > > > > > > > #include <assert.h> > > > > > > > > #include <fcntl.h> > > > > > > > > #include <io.h> > > > > > > > > #include <stdio.h> > > > > > > > > > > > > > > > > int main (void) { > > > > > > > > _setmode (_fileno (stderr), _O_U8TEXT); > > > > > > > > assert (0); > > > > > > > > return 0; > > > > > > > > } > > > > > > > > ``` > > > > > > > > > > > > > > > > When compiled with MSVC, it properly prints message about > > > > > > > > failed assertion. When it is compiled with mingw-w64's headers > > > > > > > > (Msys2/UCRT64) it produces no output. > > > > > > > > > > > > > > > > mingw-w64's assert.h maps assert() macro to _wassert only when > > > > > > > > _UNICODE or UNICODE is defined. MSVC's assert.h always maps > > > > > > > > assert() macro to _wassert and even no longer exposes _assert > > > > > > > > function. > > > > > > > > > > > > > > > > How about we always map assert() macro to _wassert for > > > > > > > > msvcr80.dll and later? Since we also emulate _wassert for > > > > > > > > msvcrt.dll, it should be OK to map it to _wassert for > > > > > > > > msvcrt.dll as well. > > > > > > > > > > > > > > > > - Kirill Makurin
_______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public