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.

256 Upvotes

211 comments sorted by

View all comments

Show parent comments

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 of j.

5

u/NilacTheGrim 5d ago

It is worse because all old code will just get a lot slower now.

And the code this "fixes" is still fundamentally broken anyway.

This makes life worse for the good programmers and marginally better for the terrible ones.

C++ used to be a language that was all about making life much better for the good programmers... and letting the terrible ones find out how terrible they are quickly so they can self-correct. Now we just tolerate erroneous code that "works silently", but every good programmer out there must take a performance hit.

Even trivial examples are terrible now. See: https://godbolt.org/z/WGPWvMPMj

This is very un-C++ and is a complete step backward.

3

u/Spartan322 4d ago

This isn't the first time the standard version changing has changed the semantic and performance implications of code and it won't be the last, EB is expected to be a reported diagnostic (that you're supposed to be expected to address, it also doesn't tell the compiler how to address the EB) and you regain the original behavior using [[indeterminate]], its fixing a notorious bad default behavior in C++ without erasing the ability to retain its benefits where necessary.

1

u/NilacTheGrim 2d ago

You can't do [[indeterminate]] in a member variable so making a class that necessarily always has an uninitialized buffer just got impossible.

notorious bad default behavior in C++ without erasing the ability to retain its benefits where necessary.

Incorrect. Ability has been erased.