https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93181

            Bug ID: 93181
           Summary: -Wuninitialized fails to warn about uninitialized
                    value; -Wmaybe-uninitialized should also warn.
           Product: gcc
           Version: 9.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: intvnut at gmail dot com
  Target Milestone: ---

GCC 4.1.2 previously warned about p being used uninitialized in code such as
the following:

#include <stddef.h>

void ub_express(int);
void test(void);

struct foo {
    int count;
};

extern struct foo a, b;
struct foo a, b;

void ub_express(int x) {
    struct foo *p;
    if (x == 1) {
        p = &a;
    }
    if (x == 2) {
        p = &b;
    }
    p->count++;
}

void test(void) {
    for (int i = 0; i < 3; ++i) {
        ub_express(i);
    }
}

https://godbolt.org/z/xd8vsL

<source>:21: warning: 'p' is used uninitialized in this function

With every later version of GCC I tried at Godbolt's compiler explorer up
through 9.2.0 and trunk (and the few I tried locally on my workstation), it no
longer warns.

Furthermore, 4.1.2 only warns if I retain the function 'test', as that
definitely includes a code path where 'p' is used uninitialized.  

It seems like GCC should warn about ub_express() even if 'test' isn't present
according to the description for -Wmaybe-uninitialized.  It's a similar code
pattern to the one that appears in the documentation to -Wmaybe-uninitialized:

{
  int x;
  switch (y)
    {
    case 1: x = 1;
      break;
    case 2: x = 4;
      break;
    case 3: x = 5;
    }
  foo (x);
}

I've tagged this as 9.1.0 and "C" as this oversight is present in that version,
but I see similar behavior across many GCC versions and in both the C and C++
compilers.

Reply via email to