GCC and Clang Break Standard C by Default, and the Standard Barely Notices
Your C is not standard C
A detailed list of incompatibilities between standard C and real-world C as implemented by GCC/Clang with glibc/musl. Highlights include GCC's `asm` keyword extension breaking conforming code, `FLT_ROUNDS` not reflecting runtime rounding mode, standard pragmas being no-ops in GCC after 27 years, glibc's `initstate` not returning NULL on error despite POSIX, Clang treating return type qualifiers as significant, and musl's outdated `va_start` blocking C23 features.
The committee has created an unreal language that no one can or will actually use.
- omoikane
GCC still not implementing the standard pragmas reminds me of the old GCC pragma easter egg. This is in cccp.c from gcc 0.9:
/*
* the behavior of the #pragma directive is implementation defined.
* this implementation defines it as follows.
*/
do_pragma ()
{
close (0);
if (open ("/dev/tty", O_RDONLY) != 0)
goto nope;
close (1);
if (open ("/dev/tty", O_WRONLY) != 1)
goto nope;
execl ("/usr/games/hack", "#pragma", 0);
execl ("/usr/games/rogue", "#pragma", 0);
execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
nope:
fatal ("You are in a maze of twisty compiler features, all different");
}
It's gone by gcc 1.21:
#if 0
/* This was a fun hack, but #pragma seems to start to be useful.
By failing to recognize it, we pass it through unchanged to cc1. */
...
#endif
- dzaima
> gcc, however, always defines FLT_ROUNDS to 1
Well, considering that gcc doesn't support the FENV_ACCESS pragma, and as such all fesetround calls are always UB, it is valid for it to act as if the rounding mode never changes from the default :)
- MisterTea
As someone who loves and enjoys writing Plan 9 c, all I can say is "standard c", whatever that means these days, is a mess. Too many things to name ranging from the only two oss compilers being bloated monsters, post c99 additions being pointless, in-line asm ruining portability*, and POSIX can die in a fire (along with typewriter terminals.)
I have a friend who is currently on the C committee and is likely going to leave because of all the bad ideas which have both been implemented and going to be implemented.
* No, spamming a million ugly #ifdefs all over the source files is gross and hard to read. Split up the code dammit.
- Syzygies
...and I thought Go was standard C!