[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

some lint bogosity



Tried -current lint on make.

I get:

lint -chabx -I/spare/src/usr.bin/make/obj -I/spare/src/usr.bin/make -DUSE_TIMESPEC -DHAS_BOOL_H -DHAS_PATHS_H -DHAS_EXTENDED_GETCWD  -i /spare/src/usr.bin/make/arch.c
/spare/src/usr.bin/make/arch.c:349: warning: arg #2 converted to 'unsigned long' by prototype
/spare/src/usr.bin/make/arch.c:361: warning: arg #2 converted to 'unsigned long' by prototype


This is downright bogus.

This arg is a preprocessor constant (256). There is absolutely no harm in
converting this to an unsigned long.

- fixing this by adding a cast in the snprintf is stupid;
- fixing this by writing #define BMAKE_SIZE 256UL or 
#define BMAKE_SIZE 256L is even more stupid, since it will  change arithmetic
all over the place, and not just in the snprintf call...


I've looked at the `heuristics' used. This is ptconv in hflag mode spewing
out that warning.

This is not useful, this will show many more false positives that actual
issues.

Of course, as usual, this is a can of worms.

I think that, in order to be useful, lint ought to know a bit more about
constants and things.

- it should be able to assert that the current conversion  is safe on a given
architecture, e.g., there is no issue at all with the conversion of the 
constant 256 to an unsigned long value.
- it should even be able to check whether a conversion is always safe, e.g.,
knowing the rules for the C language, a size_t will always be wide enough
for storing 256 (portable mode).