From: Paul Brook <[EMAIL PROTECTED]> Subject: Re: [Qemu-devel] [PATCH] target_posix_types.h Date: Wed, 14 Nov 2007 20:39:36 +0000
> > This means that time_t had to be tracked down on varying architectures > > to find the size and there was an assumption made that time_t is 32 bits > > - which isn't true for all targets. The next problem is that if the > > target is 32 bits but the host is 64 bits then there's a sign extension > > problem because (time_t)-1 is used for an error condition. If you don't > > correctly assign assign the 32-bit -1 to a 64-bit type then, rather than > > -1, you get 4294967295. > > Is there any guarantee that time_t is a signed type? The fact that you said > (time_t)-1 suggests it could be an unsigned type. If time_t is an unsigned > type, then casting to a wider value is still wrong. You have to special-case > the error condition. > > In the case of time_t this only becomes relevant after 32-bit time_t wrap in > approx. 99 years time, but I'd expect there are cases where it matters. The wrap on 32-bit signed time_t happens after ~68 years since the next looming time thing in unix is 2038: % date -r 2147483647 Mon Jan 18 20:14:07 MST 2038 % date -r 2147483648 Fri Dec 13 13:45:52 MST 1901 The standard says: 7.23 Date and time <time.h> 7.23.1 Components of time [#3] The types declared are size_t (described in 7.17); clock_t and time_t which are arithmetic types capable of representing times; Which is uselessly vague (no: it doesn't imply time_t is a signed number or unsigned or even an int): 6.2.5 Types ... [#21] Integer and floating types are collectively called arithmetic types. Arithmetic types and pointer types are collectively called scalar types. Array and structure types are collectively called aggregate types. Traditionally, time_t is defined as typedef long time_t; but recently you'll see it defined like so typedef int32_t time_t; or typedef int64_t time_t; Warner