Your service is not written in C.
Something under it is.
A compression library,
a database driver,
a small parser
vendored into the repository
years ago
by someone who has left.
It builds from source
in your image,
every time.
It has never needed attention.
In April 2025
GCC 15 was released,
and it changed one default.
When you do not say
which version of C you mean,
GCC used to assume gnu17.
It now assumes gnu23,
the C23 standard
with GNU extensions.
Most code does not care.
Old code often does.
For decades,
C had no built in boolean,
so libraries made their own.
typedef int bool;
Or an enum
with false and true in it.
In C23,
bool, true and false
are keywords.
That typedef
is now an error.
So is the enum.
The second change is quieter.
In old C,
a declaration with empty brackets,
int handler();
meant a function
whose arguments the compiler did not know.
You could call it
with anything.
In C23,
empty brackets mean
no arguments at all,
exactly like void.
Code that declared callbacks that way,
and then called them with arguments,
stops compiling.
Fedora moved to GCC 15
the same spring,
and package after package
needed fixing.
Other distributions
move their default compiler
one release at a time,
and your base image
follows its distribution.
So the day this reaches you
will look like nothing.
A routine image bump.
A build that fails
in a directory nobody has opened
in five years.
You can see it coming now.
Build your dependencies
with GCC 15
in a side job,
before the image makes the choice for you.
The cheapest stopgap
is to name the old standard.
Add -std=gnu17
to that library's flags,
and it builds as before.
It is a stopgap.
The real fix
is to update the library,
because most maintained ones
were patched in 2025.
If yours was not,
that tells you something too.
And for everything you build from source,
write the language version down
in the build,
rather than inheriting it.
Whatever you leave unsaid,
the compiler fills in,
and the compiler gets upgraded.
– Serguey Asael Shinder
Top comments (0)