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.
  1. 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

  2. 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 :)

  3. 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.

  4. Syzygies

    ...and I thought Go was standard C!

More from this day

2026-10-15