"sparse" warnings..

linas at austin.ibm.com linas at austin.ibm.com
Wed May 5 03:17:08 EST 2004

On Mon, May 03, 2004 at 06:23:25PM -0700, Linus Torvalds wrote:
> It's really hard to get mistakes like that on anything but "int" boundary.
> You'd never see it on a short, since constants are always at least "int"

I think you misread the example :)  The problem was not with the
constant, it was with the variable:  using a signed short for a bitflag.
Or, more precisely, using a signed short for a bitflag, setting
the 15th bit, and then using it somewhere where it can get sign-extended.
(e.g. bad 32-bit i/o code).  The sign extension clobbers the high bits.

The general rule is then "if its used as a bitflag, it should be unsigned."

grep short  include/linux/* |grep flag | grep -v unsigned

shows a dozen potentially dangerous usages.

> 	enum colors {
> 		black,
> 		red,
> 		blue,
> 		green,
> 	};

> where it never basically makes any sense to treat the enum as an integer.
> So make the type be "__attribute__((nocast))".

That would work.  A stop-gap to help catch uninitalized usage is
setting up a non-zero start value:

 	enum colors {

> eeh? Maybe, but that must have been long enough ago that I don't even
> remember what EEH stands for..

extended error handling, a way of reporting PCI bus errors that would
otherwise cause machine-checks.


** Sent via the linuxppc64-dev mail list. See http://lists.linuxppc.org/

More information about the Linuxppc64-dev mailing list