tech-userlevel archive

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

Re: using the interfaces in ctype.h



At 08:47 AM 4/17/2008 -0400, you wrote:
Argh!  Sorry, I should have been able to figure that out myself, given
the usual implementations.  My brain doesn't seem so good at seeing
the possibility of negative array indexing -- too many years of sloppy
assumptions.

However what you and Alan said about simply casting to (unsigned char)
isn't sufficient, at least on some platforms (IRIX-6, IIRC), at least
not to keep the compiler happy.

Sadly I do get the least warnings from every platform when the cast is
only to (int).  I wonder if the compiler can be taught to detect uses
where a parameter may have a value out of range even though the data
type it is declared as is wide enough.  The only solution the compiler
can really believe though, I think, would be a double cast where the
value is narrowed sufficiently before being widened again for the call.

Hmm. Back in the bad old days before C-89, casts didn't portably guarantee that the result of casting was any different than what you started with. So for example isspace((uchar) x) could be wrong if x was > 0xFF.

I remember that the recommended practice (when using Whitesmiths C) was instead:

        isspace(x & 255)

I think a smart compiler should be able to do the modulo 256 reduction without actually masking, on most platforms. In any event, when using modern compilers, the '&' will make everything an int, and shouldn't cause any warnings. (Of course, the usual #defines and so forth would normally be used instead of writing '255'....)

Best regards,
--Terry



Home | Main Index | Thread Index | Old Index