[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] target_posix_types.h
From: |
Warner Losh |
Subject: |
Re: [Qemu-devel] [PATCH] target_posix_types.h |
Date: |
Wed, 14 Nov 2007 14:06:58 -0700 (MST) |
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;
Warner