https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118702
Bug ID: 118702 Summary: -fanalyzer misses -Wanalyzer-use-of-uninitialized-value unless -fno-analyzer-state-merge is supplied Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: analyzer Assignee: dmalcolm at gcc dot gnu.org Reporter: dmalcolm at gcc dot gnu.org Target Milestone: --- See https://gcc.gnu.org/pipermail/gcc/2025-January/245436.html Given struct T { int a; int b; }; extern int bbb (struct T *, int *); extern int ccc (struct T *, int *); extern int ddd (struct T *, int); int aaa (struct T *t) { int x = 0, y; /* 'y' is uninitialized */ if (t->a) /* if this condition is true */ goto l; x += bbb (t, &y); l: if (t->b) /* and this condition is false */ x += ccc (t, &y); x += ddd (t, y); /* then 'y' is passed to ddd() uninitialized */ return x; } FWIW -fanalyzer doesn't warn: https://godbolt.org/z/EvcnMv767 unless I add -fno-analyzer-state-merge : https://godbolt.org/z/EvcnMv767 which gives: <source>: In function 'aaa': <source>:24:9: warning: use of uninitialized value 'y' [CWE-457] [-Wanalyzer-use-of-uninitialized-value] 24 | x += ddd (t, y); /* then 'y' is passed to ddd() uninitialized */ | ^~~~~~~~~~ 'aaa': events 1-7 13 | int x = 0, y; /* 'y' is uninitialized */ | ^ | | | (1) region created on stack here | (2) capacity: 4 bytes 14 | 15 | if (t->a) /* if this condition is true */ | ~ | | | (3) following 'true' branch... ─>─┐ | │ | │ |┌────────────────────────────────────────┘ 16 |│ goto l; |│ ~~~~ |│ | |└────>(4) ...to here ...... 21 | if (t->b) /* and this condition is false */ | ~ | | | (5) following 'false' branch... ─>─┐ | │ ...... | │ |┌─────────────────────────────────────────┘ 24 |│ x += ddd (t, y); /* then 'y' is passed to ddd() uninitialized */ |│ ~~~~~~~~~~ |│ | |└───────>(6) ...to here | (7) ⚠️ use of uninitialized value 'y' here Arguably the state-merging code could be smarter here; I haven't investigated the details.