RE: [PHP-DEV] Overflow checks and integral vars comparison
| From: | Anatol Belski | Date: | Mon, 24 Aug 2015 14:15:09 +0000 |
| Subject: | RE: [PHP-DEV] Overflow checks and integral vars comparison | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-87894@lists.php.net to get a copy of this message | ||
Hi Rowan,
> -----Original Message-----
> From: Rowan Collins [mailto:rowan.collins@gmail.com]
> Sent: Monday, August 24, 2015 12:29 AM
> To: internals@lists.php.net
> Subject: Re: [PHP-DEV] Overflow checks and integral vars comparison
>
> On 22/08/2015 02:38, Sherif Ramadan wrote:
> > I see. So you're not actually doing overflow checks then? Because at
> > the point you'd be checking this zend_long or size_t it could have
> > already overflowed or wrapped. The subject may have misled me to
> > understand differently.
>
> I think I understand the confusion: you are thinking of overflow as something
> which happens *within* a type based on some operation (addition,
> multiplication, etc).
>
> Anatol is talking about overflows which occur when casting *between*
> types: a value of 2^33 can safely be passed around as a 64-bit integer, no
> overflow has occurred; but attempting to cast it to a 32-bit integer will
> immediately overflow the 32-bit integer.
>
> Since many PHP extensions are wrappers around libraries which may only deal in
> 32-bit types, this cast is common, necessitating range checks like the ones
> proposed.
>
Yep, that's the exact point. Not touching arithmetic operations as it is a complex thing. Even
on 64-bit fe there are intrinsics for doing 128-bit math which could be used. ASM could be helpful
ofc, however it needs much care, fe even within GCC versions. So it is big and should be another
story :)
Overflows in the cast can happen when passing args, comparing variables of different type or
signess, or even with the numeric constants. Hence that cast (zend_long)INT_MAX for example. At the
end - it's still an overflow/underflow issue. I'm going for an RFC with this to target
7.1.
Thanks.
anatol