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: 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.





reply via email to

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