Re: [PATCH] Correct function prototype for REAL_EXIT and REAL__EXIT
Torbjorn SVENSSON <[email protected]> Tue, 28 Jan 2025 09:30:56 +0100
| Newsgroups | gmane.comp.sysutils.dejagnu.general |
|---|---|
| Message-ID | <[email protected]> |
On 2025-01-28 06:27, Jacob Bachmeyer wrote: > On 1/26/25 10:59, Torbjorn SVENSSON wrote: >> Hi Jacub, >> >> Thanks for the review. > > You are welcome. A V2 will probably be requested (or I might just do it > and credit you for the initial patch) but whether to preserve backwards > compatibility or modernize the whole file is yet to be decided. > >> >> On 2025-01-26 02:51, Jacob Bachmeyer wrote: >>> On 1/25/25 02:55, Torbjörn SVENSSON wrote: >>>> [...] >>> >>> As I understand, this is a shift in C dialect over the years if it is >>> a real issue. Originally, an empty argument list did not mean "no >>> arguments" but "unspecified arguments". To declare "no arguments" >>> you must explicitly write "func(void)" in C. >> >> It was like this, but with C23, it's no longer the case. > > Do I correctly understand that C23 also removed the K&R function > definition syntax? If so, testglue.c needs a lot more work than just a > few prototypes... I'm not an expert on the specifications, but from what I can understand of the Wikipedia article and the foot notes, I would say that the K&R style cannot be used in C23. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2510.pdf https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2432.pdf https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2841.htm >> In C23, it's considered an error to call a function where the function >> prototype does not match the call site (only exception to this is the >> elipse AFAIK). > > The ellipsis indicates varargs, so any number of arguments "match" the > ellipsis. :-) Indeed, I just wanted to make that part explicit. :) >>> While I seem to recall that the C standard has always specified >>> exit(3) to take an "int" argument, it was also implicitly intended >>> for programs hosted on Unix and a freestanding board might not use an >>> exit code and simply halt or shut down when "exit()" is called. >> >> I don't know if you are allowed to define "exit()" (without arguments) >> and still be complaint with the C standard. If you are not complaint >> with the C standard, then all bets are off. :) > > For a function like exit() or _exit() that does not return, calling a > "func(void)" implementation as if it were "func(int)" should do no > harm. For most calling conventions, even doing that with a function > that *does* return should work; the exceptions are conventions where the > callee cleans up arguments passed on the stack. I can add it to those functions, but in C23, there is no requirement on that. Having nothing within the parenthesis is equal to writing "void" in them. >> If you want the code to work more or less in the same grey zone as >> before, I guess it could change to this: >> >> #if __STDC_VERSION__ >= 202311L >> extern void REAL_EXIT (int); >> #else >> extern void REAL_EXIT (); >> #endif >> >> I can send a V2 with this if you think that is better. > > I will want a V2 in any case, but we may only need "#ifdef __STDC__" > instead of testing __STDC_VERSION__. Also, if adding explicit > prototypes, REAL_ABORT should explicitly take "(void)". I don't think that checking __STDC__ is going to work: $ diff -u0 <(echo | arm-none-eabi-gcc -dM -x c -E -o - -std=c17 - ) <(echo | arm-none-eabi-gcc -dM -x c -E -o - -std=c23 - ) --- /dev/fd/63 2025-01-28 09:04:36.687223645 +0000 +++ /dev/fd/62 2025-01-28 09:04:36.687223645 +0000 @@ -94,0 +95 @@ +#define __CHAR8_TYPE__ unsigned char @@ -267 +268 @@ -#define __STDC_VERSION__ 201710L +#define __STDC_VERSION__ 202311L @@ -301,0 +303 @@ +#define __GCC_ATOMIC_CHAR8_T_LOCK_FREE 1 Kind regards, Torbjörn >>> This also looks like you might actually know what testglue.c actually >>> does and how it is used. Could you enlighten me on that or at least >>> point me to an example of something that uses it? I am currently >>> reluctant to touch it because I do not know what changing it might >>> break. >> >> The testglue.c is used whenever you need to get status of a test case, >> but you cannot get the exit code directly by invoking the test >> application. A typical example is when you use a simulator or run >> tests on an embedded target though a GDB server. >> >> While running the gcc testsuite, you would specify that the testglue.c >> file is needed in your board definition using: >> >> set_board_info needs_status_wrapper 1 >> >> This will build the testglue.c to an object file before the tests are >> started and then include the object file in the link phase of every >> executable. >> >> [...] >> >> The technique used to override exit, abort and main using the --wrap >> argument to the GNU linker. >> >> There is probably a lot more details that I've missed here to why it's >> implemented the way it is, but at least this gives you an idea of when >> and why it's may be needed. > > Aha! Now the code in that file makes sense to me. > > > -- Jacob > >