Let’s look at this C++ program:
#include <iostream>
int main() {
int x;
if (x == 0) {
std::cout << "Zero";
}
else {
std::cout << "Not zero";
}
}When you build it in Debug and in Release mode, then:
- Debug build prints
Not zero - Release build prints
Zero
Same code. Same compiler. Different result.
What does it mean?
The bug comes from the undefined behavior of the uninitialized variable x:
int x;x is declared, but never initialized and immediately used:
if (x == 0)At this point, the program is reading a variable that has no defined value at all.
Why it happens
Stack memory
When you write:
int x;on the stack, no initialization happens. The memory might contain:
- leftover values from previous function calls
- debug patterns inserted by the runtime
- basically anything
So x is effectively “whatever bits happened to be in that memory slot”.
Debug vs Release changes memory behavior
This is where things get interesting. Debug runtimes often:
- fill stack memory with known patterns (e.g.
0xCC,0xCD) - keep extra safety checks
- avoid aggressive register optimization
So x is very likely to contain a non-zero pattern, but in Release mode:
- stack memory is not initialized
- registers are heavily optimized
- memory reuse is aggressive
So sometimesx happens to be 0, but sometimes it gets optimized into a register that defaults to zero in that execution path The C++ standard does not say that x is garbage or random or zero. It says that reading an uninitialized variable is undefined behavior what means:
- compiler is allowed to assume it never happens
- optimizations may remove or rewrite logic
- results can differ between builds, machines or even runs
How to fix it?
The simplest fix may be limited to just adding curly braces {} after x – it will zero-initialize it, so that it has a known value (equal to 0) in both types of builds:
#include <iostream>
int main() {
int x {};
if (x == 0) {
std::cout << "Zero";
}
else {
std::cout << "Not zero";
}
}Now behavior is fully defined and consistent. I also encourage to enable compiler warnings to catch all such places:
-Wall -Wextra -Wuninitialized -WerrorRead also:
- Bug of the week #13
- git log tricks you really should know
- Surprisingly necessary explanation of Python venv
- When AI gets C++ bitmask enums almost right
- 10 VS Code snippets essential for every C++ engineer
- Storing your ATTiny program in…EEPROM?
- Bug of the week #12
- Sharing variable between bash scripts
- A 40-line LLM-based bash command executor in Python
- GTest and short-circuit evaluation in C++
- AI is powerful. Snippets are instant.
- From AUTOSAR to S-Core: the first C++ pub/sub implementation
- How to write Arduino Uno code with Python?
- Combining Bazel with Docker
- Running commands with timeout on Linux
- Running Python unit tests with CMake
- Thirdparty dependencies with FetchContent
- Bug of the week #11
- Combining CMake with Docker
- How to search the internet from Linux terminal?
- Folding expressions in C++
- How to derive from an enum in Python?
- Bug of the week #10
- Trying ROS2: client/server within a single container
- Make C++ a better place #4: Go as an alternative
- How to convert hex to dec in Linux terminal?
- Setting up a Python project with CMake
- Separating builds for different configs with Bazel
- Trying ROS2: pub/sub within a single container
- Bug of the week #9
- UDP multicasting with Python
- Destruction order vs thread safety in C++
- Let’s review some code: C++ #2
- Make C++ a better place #3: D as an alternative
- Registering callback using std::function in C++
- Bug of the week #8
- TCP client/server with Python
- Simple menus in Bash scripts with select
- Calling member function on a nullptr in C++
- Bug of the week #7
- Python lru_cache explained
- How to dockerize a Python application?
- Make C++ a better place #2: CppFront as an alternative
- Parameters combinations in GoogleTest
- Data transfer with curl
- Python reduce explained
- Bug of the week #6
- Custom literals in C++
- Linux and hash command
- 5 Python good practices which make life easier
- Let’s review some code: Python #1
- Make C++ a better place #1: What does better mean
- Enums vs enum class in C++
- Bug of the week #5
- UDP client/server with Python
- Hard links in Linux
- Functions calling order in unit tests in C++
- Bug of the week #4
- Yield in Python – state machines, coroutines and more
- Copy files from another branch with Git









