[PATCH 64bit] ssize_t
Corinna Vinschen
vinschen@redhat.com
Wed Feb 20 15:18:00 GMT 2013
On Feb 20 16:08, Ralf Corsepius wrote:
> On 02/20/2013 03:14 PM, Corinna Vinschen wrote:
> >Hi Yaakov,
> >
> >On Feb 20 03:23, Yaakov (Cygwin/X) wrote:
> >>I just discovered an issue resulting from this commit:
> >>
> >>2002-06-27 Jeff Johnston <jjohnstn@...>
> >>
> >> * libc/include/sys/_types.h: Define _ssize_t as int if int is
> >> 32-bits, otherwise define it as long.
> >>
> >>On x86_64-cygwin (as on Linux), int is still 32 bits, but size_t is a
> >>64bit unsigned long and ssize_t should be as large but signed.
> >>Possible patch for newlib attached; corresponding patches for
> >>cygwin-64bit-branch on cygwin-patches@.
> >
> >Thanks for the patch. I'm just wondering if ssize_t shouldn't ideally
> >be based on size_t, at least when using GCC. GCC has a predefined
> >__SIZEOF_SIZE_T__ macro.
> >
> >What I'm thinking of is something like
> >
> >#ifndef __ssize_t_defined
> ># ifdef __SIZEOF_SIZE_T__
> ># if defined (__SIZEOF_INT__) && __SIZEOF_SIZE_T__ == __SIZEOF_INT__
> >typedef int ssize_t;
> ># else
> >typedef long ssize_t
> ># endif
> ># elif defined(__INT_MAX__) && defined(__LONG_MAX__) && __LONG_MAX__ == __INT_MAX__
> >typedef int _ssize_t;
> ># else
> >typedef long _ssize_t;
> ># endif
> >#endif
> >
> >
> >Does that make sense?
>
> GCC requires exact symmetry of types between ssize_t and size_t.
> I.e. checking for sizes of types is not sufficient for [s]size_t.
Do you have a code suggestion then? GCC doesn't define ssize_t
by itself, nor in stddef.h except for BeOS. And the only predefines
helping us are
#define __SIZE_MAX__ 18446744073709551615UL
#define __SIZEOF_INT__ 4
#define __SIZEOF_LONG__ 8
#define __SIZEOF_SIZE_T__ 8
#define __SIZE_TYPE__ long unsigned int
#define __SIZEOF_LONG_LONG__ 8
Corinna
--
Corinna Vinschen
Cygwin Maintainer
Red Hat
More information about the Newlib
mailing list