Cap it at INT_MAX, yeah, that seems reasonable. A notice seems reasonable but production servers displaying errors... devs will go mad :) On Jul 18, 2012 11:39 PM, "Nikita Popov" <nikita....@gmail.com> wrote:
> 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 > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >