Mailing List Archive


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

Re: [tlug] compilation warnings for unsigned char



["Stephen J. Turnbull" (Re: [tlug] compilation warnings for unsigned char) writes:]
>> >>>>> "Jim" == Jim Breen <Jim.Breen@example.com> writes:
>>     Jim> With my latest distro (FDC4) the gcc (version 4.0.2 20051125
>>     Jim> (Red Hat 4.0.2-8)) spews out warnings for every strcpy,
>>     Jim> strcat, etc. E.g.
>> 
>> If you have no worries about anything but char, try -Wno-conversion.
>> Unfortunately, conversions of integers generally *are* dangerous, so
>> you could lose bad.  I don't recommend it :-(, but you know your code
>> better than I do.

I tried that - it made no difference.

>>     Jim> Putting -funsigned-char as a gcc option makes no difference.
>> 
>> Good!  The libraries you're calling were compiled with the default
>> definition of char; their prototypes should not be changed.  (I wonder
>> how they manage this?  I don't see anything obvious in <string.h>.)

Hmmm. It says (in string.h):
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)

I assumed that __restrict was the problem.

>> What might fool GCC is to change the type that you use to "char" and
>> then use -funsigned-char.  This would of course hose anybody whose
>> compiler doesn't support -funsigned-char.  You probably don't want to
>> do that.

Ironically that gets me back where I was 15 years ago. My Japanese-
pushing code began in 1991 with a DOS dictionary program (JDIC). In that
I used vanilla "char" and set the compiler (Turbo C) to treat all char
as unsigned. Never a problem.

When I pulled a lot of the JDIC.c code into xjdicin 1992, I found there was 
no global setting possible (I think -funsigned-char  came later), so I
made all my chars unsigned (I think the concept of a signed char is
quite flakey anyway.)

I may well try that.

>>     Jim> Can anyone suggest a solution/workaround?
>> 
>> The following is good because you know that these functions only test
>> for equality.  It might be preferable to do this at a somewhat higher
>> level, if you have some standard patterns of usage you could encapsulate.
>> 
>> #ifdef PSYCHOPATHIC_GCC
>> # ifdef I_TRUST_CPP
>> 
>> #define strcat(head,tail) strcat ((char *) (head), (char *) (tail))
>> 
>> # else
>> 
>> inline unsigned char *
>> gcc_in_a_straitjacket_strcat (unsigned char *head, unsigned char *tail)
>> {
>>   return (unsigned char *) strcat ((char *) head, (char *) tail);
>> }
>> 
>> #undef strcat
>> #define strcat gcc_in_a_straitjacket_strcat
>> 
>> # endif /* I_TRUST_CPP */
>> #endif /* PSYCHOPATHIC_GCC */
>> 
>> If there isn't an autoconf macro to test for PSYCHOPATHIC_GCC, there
>> should be!  I_TRUST_CPP is a developer constant, so one arm can be
>> optimized away. :-)

I have tried just the I_TRUST_CPP section in my .h file and
it worked for strc* but I shudder to think of doing it for
everything like sprintf, etc.

What a stupid mess. Why for Bog's sake does the signed-ness of char
matter for things like strcat and strcpy anyway?  Mutter, mutter.

I may well just move everything to char, set -funsigned-char and be done
with it.

Jim

-- 
Jim Breen                                http://www.csse.monash.edu.au/~jwb/
Clayton School of Information Technology,               Tel: +61 3 9905 9554
Monash University, VIC 3800, Australia                  Fax: +61 3 9905 5146
(Monash Provider No. 00008C)                ジム・ブリーン@モナシュ大蛙触Â


Home | Main Index | Thread Index

Home Page Mailing List Linux and Japan TLUG Members Links