https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93301
Bug ID: 93301 Summary: Wrong optimization: instability of uninitialized variables leads to nonsense Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: ch3root at openwall dot com Target Milestone: --- Instability is inconsistency, which leads to logical contradictions, which leads to total chaos. Similar to bug 61502, comment 42, but with uninitialized variables: ---------------------------------------------------------------------- #include <stdio.h> __attribute__((noipa)) // imagine it in a separate TU static void *opaque(void *p) { return p; } int main() { int c = 1; opaque(&c); unsigned char x = 0; opaque(&x); unsigned char y; // no trap representation possible (void)&y; // disarm C11, 6.3.2.1p2 unsigned char z; int b; if (x == y) { b = 1; z = x; } else { b = 0; z = y; } opaque(&b); if (b) printf("b = %d c = %d x = %d e = %d\n", b, c, x, c ? z : 5); } ---------------------------------------------------------------------- $ gcc -std=c11 -O3 test.c && ./a.out b = 1 c = 1 x = 0 e = 5 ---------------------------------------------------------------------- gcc x86-64 version: gcc (GCC) 10.0.1 20200117 (experimental) ---------------------------------------------------------------------- Given that the printf has fired, `b` is `1`, hence `z` is the same as `x` and `e = 0` should be printed. According to my reading of C11 this program doesn't invoke UB. (And I thought that most proposals about "wobbly" values wouldn't change this but I'm not sure anymore:-) Even if this particular example is deemed undefined by gcc, I guess inconsistencies could blow everything up even without any help from a programmer. clang bug -- https://bugs.llvm.org/show_bug.cgi?id=44512.