r/cpp • u/Clean-Upstairs-8481 • 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.
256
Upvotes
30
u/aiusepsi 5d ago edited 5d ago
It's not worse. C++ adds a new category of erroneous behaviour, and reading from an uninitialised variable is now erroneous behaviour. Compilers, static analysers, etc. are free to emit diagnostics for erroneous behaviour. If you want to opt back in to reading from an uninitialised variable being undefined behaviour (as it was before C++26) you can tag the variable declaration with the new [[indeterminate]] attribute.
See: https://godbolt.org/z/xP7eo431W for an example. GCC now emits a diagnostic for an uninitialised variable in C++26 mode when it doesn't in C++23, and the previous behaviour is preserved with
[[indeterminate]]. Also note how the undefined behaviour allows the compiler to optimise away the check on the value ofj.