[RFC] -Wredundant-decls: keep it or remove it?

Craig Rodrigues rodrigc at crodrigues.org
Wed Aug 10 01:44:28 GMT 2005


Hi,

In recent days, while trying to get the kernel in shape to
compile with GCC 4.0, I encountered some examples such as the
following in net/rtsock.c:

extern struct domain routedomain;               /* or at least forward */

static struct protosw routesw[] = {
{ SOCK_RAW,     &routedomain,   0,              PR_ATOMIC|PR_ADDR,
  0,            route_output,   raw_ctlinput,   0,
  0,
  raw_init,     0,              0,              0,
  &route_usrreqs
}
};

static struct domain routedomain =
    { PF_ROUTE, "route", 0, 0, 0,
      routesw, &routesw[sizeof(routesw)/sizeof(routesw[0])] };





It is illegal in ISO C to declare a struct as extern (implying external linkage)
, and then declare it as static (implying internal linkage).

I have two options to fix this.

OPTION 1:

Change routedomain to not be static:

extern struct domain routedomain;

....
struct domain routedomain = { ...... }




OPTION 2:

Forward declare routedomain as static, but remove -Wredundant-decls
from kernel makefiles:

static struct domain routedomain;

....
static struct domain routedomain = {  ..... }


For OPTION 2, it is necessary to remove -Wredundant-decls
because you will get a new compiler warning:

warning: redundant redeclaration of 'routedomain'
warnig: previous declaration was here ...


To fix this problem, is it better to go with OPTION 1
or OPTION 2?  I am a bit hesitant to remove -Wredundant-decls
from the kernel Makefiles, because it has been there for a long time.
Are there cases where the warnings are useful?

It seems to warn against legitimate C code in
the GCC documentation:

`-Wredundant-decls'
     Warn if anything is declared more than once in the same scope,
     even in cases where multiple declaration is valid and changes
     nothing.

Any feedback would be appreciated.

-- 
Craig Rodrigues        
rodrigc at crodrigues.org


More information about the freebsd-arch mailing list