[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] target_posix_types.h
From: |
Thayne Harbaugh |
Subject: |
Re: [Qemu-devel] [PATCH] target_posix_types.h |
Date: |
Wed, 14 Nov 2007 14:25:17 -0700 |
On Wed, 2007-11-14 at 14:06 -0700, Warner Losh wrote:
> From: Paul Brook <address@hidden>
> 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.