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 22-Apr-08, at 3:51 AM, Alan Barrett wrote:
Can anybody confirm the existence of compilers such that
this code:

        #include <ctype.h>
        int f(void)
            signed char c = -1;
            return isupper((unsigned char)c);

produces a warning which can be quieted by an additional cast to int,

        return isupper((int)(unsigned char)c);


Potentially some compiler might complain about the unsigned char to signed int promotion without the explicit (int) cast, though apparently GCC doesn't (at least not so long as UCHAR_MAX <= INT_MAX).

I'll try to get access to IRIX and Solaris machines again to try these. IIRC it was one of these I was seeing warnings from, and most likely it was IRIX, perhaps with whatever sensible warning options their compiler supports(*). Unfortunately that's the one I'm least likely to be able to get access to again so anyone else who has access to IRIX systems should try it.

(*) In Smail-3 I used the following on IRIX-6.x last time I tested it there:

        CFLAGS="-Xa -g3 -O3 -fullwarn -diag_suppress 1184,1209,3201,3496"
        LDFLAGS="-g3 -O3"

BTW, can anyone say with any degree of certainty which, if any, C implementations (hosted) will extend the sign when the value of a "char *" pointer is assigned to a plain "int"? I.e. in "int i = *s;"

DMR says (in the second edition of "The C Programming Language", p. 44): "On some machines a char whose leftmost bit is 1 will be converted to a negative integer ("sign extension")." In the first edition he also said "(PDP11, for instance)". Harbison and Steele, in "C A Reference Manual" say much the same too of course, though never in exactly the context of using the result of indirecting a "char *" pointer. DMR uses the "int c; char *s; while ((c = *s)) ..." idiom at least once (p.156), though perhaps that was a mistake.

                                        Greg A. Woods; Planix, Inc.

Home | Main Index | Thread Index | Old Index