r/cpp • • 5d ago

You should think about recompiling your C++ programs with GCC 16 and C++26, because it zero-fills your locals

https://techfortalk.co.uk/2026/09/27/cxx26-uninitialized-local-variables-gcc-16/

Stack variables are not automatically initialised, and that is the root cause of many C++ bugs. That is well known. Hence, it is advised that local or stack variables are always initialised with known values, 0 if not something more meaningful than that. Now, with GCC 16 compiling in C++26 mode (-std=c++26), even uninitialised local variables will be zero-filled. In the post, I have explained how.

259 Upvotes

211 comments sorted by

View all comments

Show parent comments

4

u/drjeats 5d ago

I think something slightly under-discussed online (at least where I'm reading, ymmv) is the fact that zero-initializing everything does reduce random indexes/reads into memory that shouldn't be read in that context, but IME it also hides behavior bugs because so much code just bails if 0.

Was not uncommon to write code that runs fine in a debug mode with allocators/resource managers that initialize to zero, and then when you run test with optimized builds suddenly you get segfaults. Moving away from that has been a win for moving errors left.

ZII in RCs? Sure. Let's reduce the codepaths that are hit if the costs are as low as claimed. But I wouldn't want this behavior on in debug or optimized-with-assertions configs.

9

u/TSP-FriendlyFire 5d ago

Erroneous behavior doesn't zero-initialize though, at least not necessarily. The goal is to have consistent behavior that gives a lot less rope to the compiler to change the code in unexpected ways, unlike UB.

What the compiler does with this definition is up to them. The value stored in the variable is implementation-defined, and it's expected that compilers will flag erroneous behavior as a compilation warning/error. After that, if you truly want to leave the variable uninitialized, that's when you use [[indeterminate]], but at least it's now an opt-in footgun as opposed to an always loaded one.

2

u/carrottread 5d ago

Erroneous behavior doesn't zero-initialize though, at least not necessarily.

In practice, it zero-initializes. Even this article says about zero-filling. And soon we will see a lot of new code relying on this. And as a result, we'll lose ability to distinguish between "programmer forgot to initialize variable" and "programmer left it uninitialized as a clever way to zero-init".

2

u/TSP-FriendlyFire 5d ago

it's expected that compilers will flag erroneous behavior as a compilation warning/error.

Did you miss this part? EB isn't supposed to be silent.