Re: Re: Bug #46701
| From: | Matt Wilmas | Date: | Wed, 18 Feb 2009 13:25:39 +0000 |
| Subject: | Re: Re: Bug #46701 | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-43091@lists.php.net to get a copy of this message | ||
Hi Zoe, all,
----- Original Message -----
From: "zoe"
Sent: Wednesday, February 18, 2009
> Moriyoshi Koizumi wrote:
> > Please don't even think of backporting. This will definitely break a
> > lot of things, and this kind of thing must not be done in a minor
> > release.
> >
> >
> --snip--
>
> >>>> I guess the patch relies on the 5.3's DVAL_TO_LVAL behavior that was
> >>>> changed by the fix for bug #42868, right?
> >>>> If so, this patch shouldn't be MFH'ed as the #42868 patch was not
> >>>> merged although I didn't remember any discussion on this.
> >>>>
> >>>> See also:
> >>>> http://marc.info/?l=php-internals&m=120799720922202&w=2
> >>>>
> >>>>
> Hey all
>
> I'm sorry - I should have replied to this before since I was responsible
> for raising #42868. I didn't do a good job at explaining what the issue
> was in that bug, mainly because I didn't know what it was when I
> started. The central problem is that PHP's behaviour on casting double
> to int defaults to whatever the underlying C environment does. On
> Windows and Linux (all of the versions that I looked at) this turns out
> to be a simple truncation of the last 32 bits. Unfortunately the C
> behaviour is 'undefined' (Kernigan and Ritchie, page 197, A6.3). The
> issue that I found in #42868 was that on the Mac the casting behaviour
> is completely different so many of the PHP tests failed. I believe that
> PHP should behave in a platform independent way - that is what the fix
> to #42868 achieves. It is also fair to say that any applications that
> depend on the overflow behaviour in PHP 5.2 cannot be guaranteed to run
> on any platform.
(I'm glad this change was reverted for 5.2...)
Anyway, like I said in my "5.3 todos" reply, I'll send a possible
DVAL_TO_LVAL, etc. solution (consistent/reliable overflow across platforms)
for consideration as soon as I can... There are other inconsistencies and
behavior changes with the existing code, and it definitely doesn't behave in
a platform-independent way! With the 4 versions of DVAL_...: old, 32 bit,
64 bit, 64 bit Windows (not sure why it's there; its longs are still 32
bit?), things I can think of:
- 64-bit Windows has no range limiting for casting, so it's free to overflow
like the old way...? Other 64 bit limits the range to LONG_MAX/MIN. 32 bit
still casts between LONG_MAX and MAX_UNSIGNED_INT (ULONG_MAX-ish?), and,
presumably, it's supposed to overflow between those 2, but casting of the
out-of-range unsigned long is also "implementation-defined," so still cannot
be guaranteed.
- Conversion of INF/-INF: the old version and 64 bit Windows now will
convert them to 0. 32 bit and other 64 bit will convert them to
LONG_MAX/LONG_MIN.
- With zend_parse_parameters(), a numeric string that results in a double is
still converted using a simple (long) cast only. (In my proposed changes, I
was going to add a new conversion specifier (simple few lines), like capital
'L', for functions that want/need to limit the long without overflow, like
lengths for some string functions that I *thought* was trying to be fixed
orginally.)
> Zoe
- Matt