On Thu, Jan 30, 2025 at 10:48:43AM +0100, Richard Biener via Gcc wrote:
> On Thu, Jan 30, 2025 at 10:01 AM Dmitry Antipov <[email protected]> wrote:
> >
> > With (probably) -Wmaybe-uninitialized and/or -Wextra, shouldn't the
> > compiler emit
> > warning about possibly uninitialized 'y' passed to 'ddd()' in the example
> > below?
> >
> > 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);
>
> We consider bbb to likely initialize 'y', so do not diagnose the use
> on the ddd call
> below.
That is not the problem, sure, if bbb or ccc is called, we shouldn't warn.
But neither of those could be called.
Before uninit1 pass we have
# .MEM_10 = VDEF <.MEM_8(D)>
_11 = bbb (t_9(D), &y);
...
# .MEM_6 = PHI <.MEM_8(D)(7), .MEM_10(3)>
...
# .MEM_12 = VDEF <.MEM_6>
_13 = ccc (t_9(D), &y);
...
# .MEM_7 = PHI <.MEM_6(8), .MEM_12(5)>
# VUSE <.MEM_7>
y.0_3 = y;
So, uninit1 should be able to see that there is a path through the cfg in
which y is uninitialized. Maybe we do this unitialized memory test only for
the trivial cases where it is always uninitialized and not walk the PHIs
if there could be one.
Jakub