warnings from use of ctype.h methods

Joel Sherrill joel.sherrill@oarcorp.com
Thu Mar 11 16:48:00 GMT 2010


On 03/11/2010 10:27 AM, Eric Blake wrote:
> On 03/11/2010 09:16 AM, Joel Sherrill wrote:
>    
>> warning: array subscript has type 'char'
>>
>> Most, if not all, of these appear to be from
>> using ctype.h methods which is caused by
>> a missing (int) case in line 57 in ctype.h:
>>
>> #define __ctype_lookup(__c) ((__ctype_ptr__+sizeof(""[(__c]))[(int)(__c)])
>>
>> Changing this to the following resolved the
>> warnings.
>>
>> #define __ctype_lookup(__c)
>> ((__ctype_ptr__+sizeof(""[(int)__c]))[(int)(__c)])
>>
>> This is with newlib 1.18.0 with the current RTEMS
>> patch.
>>
>> Does this cast need to be added?
>>      
> Absolutely not.  The warning is _intentional_.  You have a bug in your
> code - you are calling the ctype methods with a char argument, but char
> is signed, and an 8-bit char is out of range and causes unspecified
> results according to the standards.  In particular, that warning was
> added because we had a demonstration of where isspace(255u) and
> isspace(EOF) intentionally give different results in some locales, but
> where the calling app had been doing isspace((char)255) and going into
> an infinite loop because of their bug.  You should fix your code to use
> unsigned char or int, as appropriate, in the first place.
>
>    
Thanks for the explanation.  I will look
at the cases in question and see what to do.  What
do you recommend for the case where code is using
a char * pointer to iterate through a string and then
calling isXXX(*c)?  Add a cast to the call?  Or assign
*c to an int local variable?  I can't change the pointer
type or it won't iterate right.

-- 
Joel Sherrill, Ph.D.             Director of Research&  Development
joel.sherrill@OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
    Support Available             (256) 722-9985




More information about the Newlib mailing list