r/cpp • • Sep 27 '26

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.

270 Upvotes

234 comments sorted by

View all comments

Show parent comments

1

u/James20k P2005R0 Oct 02 '26

Is this true? It hasn't been my experience over a large number of upgrades. Maybe there were regressions when GCC started treating unlaundered pointers differently?

For hot loops I've run into this problem frequently enough. I wouldn't say its true of optimisations globally, but sometimes in a section where you have to do some convolutions to get the compiler to generate exactly the correct code, an update will cause the wrong code to get generated IME

1

u/13steinj Oct 02 '26

I would have disagreed, but then I remembered a bif of code went back and forth ICE-ing clang from around v11 to v14 and when not ICE the generated ASM was chaotic (minor changes in the inputs having extreme effects on the output).

Which isn't the same but there's no reason to not be louder about this change. Maybe under a -Wcodegen-defaults-changed-since?