qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]