On Wed, 2007-11-14 at 14:06 -0700, Warner Losh wrote: > 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;
Interesting. Thank you. My intention wasn't to discuss time_t in particular but to point out an example of a class of bugs.