Using -Wshadow

Started by Neil Conwayabout 22 years ago7 messages
#1Neil Conway
neilc@samurai.com

GCC supports the -Wshadow command-line option:

-Wshadow
Warn whenever a local variable shadows another local
variable, parameter or global variable or whenever a
built-in function is shadowed.

Currently, enabling this for the PostgreSQL tree produces a lot of
warnings. Would anyone object if I corrected these usages of a
shadowed local variable, and then enabled this warning flag for
standard GCC builds? (as is currently done for -Wmissing-prototypes,
-Wmissing-declarations, and -Wall).

If there are any other GCC warning flags anyone else feels would be
useful, let me know.

-Neil

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Neil Conway (#1)
Re: Using -Wshadow

Neil Conway <neilc@samurai.com> writes:

GCC supports the -Wshadow command-line option:
-Wshadow
Warn whenever a local variable shadows another local
variable, parameter or global variable or whenever a
built-in function is shadowed.

Currently, enabling this for the PostgreSQL tree produces a lot of
warnings. Would anyone object if I corrected these usages of a
shadowed local variable, and then enabled this warning flag for
standard GCC builds?

How many is "a lot"? What are the odds that this would produce spurious
warnings on some platforms due to shadowing of platform-specific
functions or globals?

I wouldn't object to something that catches shadowings of parameters or
local variables, but I think the flag as defined is not very useful.

If there are any other GCC warning flags anyone else feels would be
useful, let me know.

I have for a long time wanted to enable -Wcast-align and -Wpointer-arith,
but so far the tedium of getting rid of the warnings exceeds my
enthusiasm for it.

Another nice thing would be to get rid of the warnings about casting
between "char" and "unsigned char" that pop up on many (most?) non-gcc
compilers. Most of the occurrences are in or near the multibyte stuff,
so maybe this could be coordinated somehow with Peter's plans for
upgrading locale support.

regards, tom lane

#3Kurt Roeckx
Q@ping.be
In reply to: Neil Conway (#1)
Re: Using -Wshadow

On Mon, Nov 24, 2003 at 12:25:32PM -0500, Neil Conway wrote:

If there are any other GCC warning flags anyone else feels would be
useful, let me know.

I find the following also useful:
-Wcast-align
-Wcast-qual
-Wpointer-arith
-Wstrict-prototypes

And maybe:
-Waggregate-return

Kurt

#4Neil Conway
neilc@samurai.com
In reply to: Tom Lane (#2)
Re: Using -Wshadow

Tom Lane <tgl@sss.pgh.pa.us> writes:

Neil Conway <neilc@samurai.com> writes:

Currently, enabling this for the PostgreSQL tree produces a lot of
warnings.

How many is "a lot"?

Maybe a couple hundred or so, but most of the warnings are derived
from a few globals with common names -- I would guess it won't be too
much trouble to fix...

What are the odds that this would produce spurious warnings on some
platforms due to shadowing of platform-specific functions or
globals?

No idea -- I'm content to jump that bridge (e.g. by removing -Wshadow
if necessary) when we come to it.

Ok, I'll work on this and submit a patch to -patches when I'm
done. I'll leave the work on the other warning flags you mentioned for
someone else.

-Neil

#5Neil Conway
neilc@samurai.com
In reply to: Tom Lane (#2)
Re: Using -Wshadow

Tom Lane <tgl@sss.pgh.pa.us> writes:

I wouldn't object to something that catches shadowings of parameters
or local variables, but I think the flag as defined is not very
useful.

On closer examination, that seems like a prescient comment. There are
about 1100 distinct warnings enabled by this flag. Of these, about 900
are caused by shadowed names from system headers: for example, using
'index' or 'shutdown' as the name of a function parameter. Note that a
single instance of shadowing in a header file generates warnings every
time that header file is included, so the number of actual places that
need to be changed should be smaller than 1100.

There are about 200 warnings that are not shadows of something from
the system headers. A fair number of these are also not very useful
(e.g. every variable named "length" triggers a warning, since that
shadows a function defined in pg_list.h), but there are also a fair
number of legitimately-shadowed local variables.

I think this leaves us with three options:

(1) Do nothing

(2) Enable -Wshadow for GCC, fix all the instances of the warning in
the source tree.

(3) Manually scan through the list of warnings and just submit
patches for the legitimate instances of shadowing.

The problem with #2 is the large number of warnings induced by system
headers: other platforms / standard libraries may well cause
additional instances of shadowing, so it might take a little while to
track down all the spurious warnings. On the other hand, it would be
nice if we could just turn this on and then forget about it.

Any comments?

-Neil

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Neil Conway (#5)
Re: Using -Wshadow

Neil Conway writes:

The problem with #2 is the large number of warnings induced by system
headers: other platforms / standard libraries may well cause
additional instances of shadowing, so it might take a little while to
track down all the spurious warnings.

Yes, that's what I'm afraid of. We might be chasing warnings forever.
I'm not sure what the point is anyway. Shadowing is perfectly
well-defined and I've never heard of a real problem because of it.

--
Peter Eisentraut peter_e@gmx.net

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#6)
Re: Using -Wshadow

Peter Eisentraut <peter_e@gmx.net> writes:

I'm not sure what the point is anyway. Shadowing is perfectly
well-defined and I've never heard of a real problem because of it.

Well, shadowing a formal parameter with a local variable is most likely
a mistake, and shadowing a local with a more-tightly-nested local is,
if not an outright mistake, certain to confuse future maintainers.
So I'd be in favor of getting rid of cases like that.

I can't get excited about forbidding shadowing of globals by locals,
though ... seems like that's practically giving up one of the
advantages of having a block-structured language in the first place.

BTW, what I find by experiment with gcc 2.95.3 is that
local-shadowing-formal is warned of just with -Wall, if the local is
declared at the function's outermost brace level, whether or not you
say -Wshadow. So we already know we have none of those.

regards, tom lane