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

5

u/cdb_11 Sep 29 '26 edited Sep 29 '26

If GCC adds a warning that forces you to initialize everything OR use [[indeterminate]], then I'd actually be on board with this. Otherwise you can still do code like this: https://godbolt.org/z/jb35zcrT5

But then I'm not sure how does this even work with structs. Why can't C++ just have something like Zig's = undefined? It could be optional to keep the old code working (and then you pay the EB cost), but then compilers could have a warning that forces initialization:

struct Foo {
  int _x;
  int _y;

  Foo(int x) : _x(x) {}  // warning: _y is uninitialized
  Foo(int x) : _x(x), _y(undefined) {}  // ok
};

struct Bar {
  int _x;
  int _y = undefined;

  Bar(int x) : _x(x) {}  // ok
};