tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: using the interfaces in ctype.h
On Wed, Apr 16, 2008 at 10:24:41PM -0400, Greg A. Woods; Planix, Inc. wrote:
>
> On 16-Apr-08, at 6:30 PM, Christos Zoulas wrote:
> > - cast ctype arguments to unsigned char and not int, otherwise you silence
> > the warning but you can still get a core-dump.
>
>
> If you're talking about the is*() and to*() APIs from libc then that doesn't
> seem to make any sense for a standards compatible program.
>
> The definitions in all of the standards, an in the NetBSD manual pages, all
> request that the parameters for these functions are to be passed as (int).
>
> Unfortunately even various NetBSD architectures, at least for some releases,
> are inconsistent in how these interfaces are defined and what warnings are
> given for various usages. I've had the best luck getting the least warnings
> on a wide variety of platforms by always casting to (int) too.
These functions accept int only because they need to handle (-1) argument,
i.e. possible result of getc(3). I.e. valid character code range is
from -1 to 256.
If char is signed (it is on NetBSD/i386 IIRC), by casting to int
you get negative number and the array access done by is*() macros
causes coredump (or overwrites some memory).
You must cast argument of is*() to (unsigned char) always first. You can
do (int)(unsigned char) cast if just (unsigned char) gives you a warning.
Jaromir
--
Jaromir Dolecek <jdolecek%NetBSD.org@localhost> http://www.NetBSD.cz/
-=- We can walk our road together if our goals are all the same; -=-
-=- We can run alone and free if we pursue a different aim. -=-
Home |
Main Index |
Thread Index |
Old Index