Hi internals!
When a large floating point number is cast to an integer we currently
have very low-level C behavior (integer overflow and wraparound):
$ /c/php-5.4.1/php -r 'var_dump((int) 4000000000);'
int(-294967296)
$ /c/php-5.4.1/php -r 'var_dump((int) 6000000000);'
int(1705032704)
As a fun fact, if you do the same thing with a string float the number
if clipped instead of wrapped:
$ /c/php-5.4.1/php -r 'var_dump((int) "4000000000");'
int(2147483647)
This also applies to zend_parse_parameters. l arguments are wrapped, L
arguments are clipped.
In my eyes this kind of behavior has nothing to do in PHP. PHP is a
high-level language, it shouldn't exhibit low-level stuff like integer
overflows and wraparound.
I think that at least for zend_parse_parameters this should be
changed. Overflowing float parameters should not be accepted. Instead
throw the usual E_WARNING
and return FAILURE.
I'm not sure though what one should do about the explicit (int) cast.
My preference would be to throw a notice and use the clipping
behavior.
Thoughts?
Nikita
Cap it at INT_MAX, yeah, that seems reasonable. A notice seems reasonable
but production servers displaying errors... devs will go mad :)
Hi internals!
When a large floating point number is cast to an integer we currently
have very low-level C behavior (integer overflow and wraparound):$ /c/php-5.4.1/php -r 'var_dump((int) 4000000000);'
int(-294967296)$ /c/php-5.4.1/php -r 'var_dump((int) 6000000000);'
int(1705032704)As a fun fact, if you do the same thing with a string float the number
if clipped instead of wrapped:$ /c/php-5.4.1/php -r 'var_dump((int) "4000000000");'
int(2147483647)This also applies to zend_parse_parameters. l arguments are wrapped, L
arguments are clipped.In my eyes this kind of behavior has nothing to do in PHP. PHP is a
high-level language, it shouldn't exhibit low-level stuff like integer
overflows and wraparound.I think that at least for zend_parse_parameters this should be
changed. Overflowing float parameters should not be accepted. Instead
throw the usualE_WARNING
and return FAILURE.I'm not sure though what one should do about the explicit (int) cast.
My preference would be to throw a notice and use the clipping
behavior.Thoughts?
Nikita