This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: No warning for unreachable code


I'm suggesting that there's no big difference between unsigned char and
unsigned int (and unsigned long...) in this case, and, therefore
compiler's behaviour should be consistent.

But there is a difference.


When "x" is an unsigned int, the expression "x < 0" is equivalent to
	(unsigned int) x < (unsigned int) 0
which can never be true, whatever "x" is, and results in
	warning: comparison of unsigned expression < 0 is always false

When "x" is an unsigned char however, it reads
	(int) x < (int) 0
which only cannot happen because of the particular values "x" can take,
and the warning is
	warning: comparison is always false due to limited range of data type

Sounds sane to me, and both warning messages are clear.

And in this case I personally
would prefer a warning in both cases with -Wall.

Then please file a PR in bugzilla so your request won't get lost.


It might be that the warning isn't in -Wall because it has too many
false positives.  This is just a guess though.

And this wasn't a purely theoretical observation. There is a driver in the
Linux kernel, that does exactly this: assigns function return code to an
unsigned int variable, and then checks for "<0"... And the compiler
happily throws the check away. Yes, I will submit a patch, but if there is
no strong reason against, maybe it would make sense to warn in these
cases.

I can try to shift the blame and say the kernel should be built with -Wextra . But then people will shout at me again, so I won't.


Segher



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]