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 <dmanti...@yandex.ru> 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

Reply via email to