Date: Wed, 15 Apr 2009 00:08:30 +0100
From: David Laight <[email protected]>
Message-ID: <[email protected]>
| The ctype functions are often implemented as #defines that index arrays,
| so if the argument is 'char' it is very likely to index off the front
| which leads to an unexpected result or core dump.
Yes, the "undefined behaviour" from the man page...
| I suspect the gcc warning here is present precisely to detect bad use
| of the ctype functiuons.
Very likely true, but it is still dumb, as in C "char" is just an int
type, outlawing indexing by char is no more sane than outlawing indexing
by short or int.
At one stage, BSD (real B BSD) unnecessarily "fixed" this by simply
allocating space in the _ctyle[] arrays with negative offsets - there's
also nothing wrong with using a negative array offset in C, provided that
the pointer it is being offset from points beyond the start of the
allocated space.
| Actually islower() used to be a requirement, old SYSV systems used the
| same array for toupper() and tolower().
Yes - and as I recall (which no-one should place much reliance upon the
accuracy of), the earliest implementations were ((c)^0x20) which
would simply have been meaningless (and wildly incorrect) if the char
didn't have the assumed case to begin with (or wasn't ascii).
kre