diff --git a/NEWS b/NEWS index 417c2ac3ee2..df072c82042 100644 --- a/NEWS +++ b/NEWS @@ -42,6 +42,7 @@ . Removed support for assigning the result of new by reference. (Nikita) . Invalid octal literals in source code now produce compile errors, fixes PHPSadness #31. (Andrea) . Removed dl() function on fpm-fcgi. (Nikita) + . Removed support for hexadecimal numeric strings. (Nikita) - Date: . Fixed day_of_week function as it could sometimes return negative values diff --git a/UPGRADING b/UPGRADING index 7c54f4167dd..7cb958f7ab5 100644 --- a/UPGRADING +++ b/UPGRADING @@ -67,6 +67,11 @@ PHP X.Y UPGRADE NOTES PHPSadness #31. Previously, the invalid digits (and any following valid digits) were simply ignored, such that 0781 became 7. . Removed dl() function on fpm-fcgi. + . Removed support for hexadecimal numeric strings. This means that some + operations like == will no longer specially interpret strings containing + hexadecimal numbers. Furthermore is_numeric() will not consider hexadecimal + strings to be numeric (use FILTER_VALIDATE_INT instead). + (RFC: https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings) - Date: . Removed $is_dst parameter from mktime() and gmmktime(). diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index f178c34880e..76a3d31a852 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2664,7 +2664,7 @@ ZEND_API zend_uchar is_numeric_str_function(const zend_string *str, zend_long *l ZEND_API zend_uchar _is_numeric_string_ex(const char *str, size_t length, zend_long *lval, double *dval, int allow_errors, int *oflow_info) /* {{{ */ { const char *ptr; - int base = 10, digits = 0, dp_or_e = 0; + int digits = 0, dp_or_e = 0; double local_dval = 0.0; zend_uchar type; @@ -2689,13 +2689,6 @@ ZEND_API zend_uchar _is_numeric_string_ex(const char *str, size_t length, zend_l } if (ZEND_IS_DIGIT(*ptr)) { - /* Handle hex numbers - * str is used instead of ptr to disallow signs and keep old behavior */ - if (length > 2 && *str == '0' && (str[1] == 'x' || str[1] == 'X')) { - base = 16; - ptr += 2; - } - /* Skip any leading 0s */ while (*ptr == '0') { ptr++; @@ -2706,42 +2699,30 @@ ZEND_API zend_uchar _is_numeric_string_ex(const char *str, size_t length, zend_l * a full match, stop when there are too many digits for a long */ for (type = IS_LONG; !(digits >= MAX_LENGTH_OF_LONG && (dval || allow_errors == 1)); digits++, ptr++) { check_digits: - if (ZEND_IS_DIGIT(*ptr) || (base == 16 && ZEND_IS_XDIGIT(*ptr))) { + if (ZEND_IS_DIGIT(*ptr)) { continue; - } else if (base == 10) { - if (*ptr == '.' && dp_or_e < 1) { - goto process_double; - } else if ((*ptr == 'e' || *ptr == 'E') && dp_or_e < 2) { - const char *e = ptr + 1; + } else if (*ptr == '.' && dp_or_e < 1) { + goto process_double; + } else if ((*ptr == 'e' || *ptr == 'E') && dp_or_e < 2) { + const char *e = ptr + 1; - if (*e == '-' || *e == '+') { - ptr = e++; - } - if (ZEND_IS_DIGIT(*e)) { - goto process_double; - } + if (*e == '-' || *e == '+') { + ptr = e++; + } + if (ZEND_IS_DIGIT(*e)) { + goto process_double; } } break; } - if (base == 10) { - if (digits >= MAX_LENGTH_OF_LONG) { - if (oflow_info != NULL) { - *oflow_info = *str == '-' ? -1 : 1; - } - dp_or_e = -1; - goto process_double; - } - } else if (!(digits < SIZEOF_ZEND_LONG * 2 || (digits == SIZEOF_ZEND_LONG * 2 && ptr[-digits] <= '7'))) { - if (dval) { - local_dval = zend_hex_strtod(str, &ptr); - } + if (digits >= MAX_LENGTH_OF_LONG) { if (oflow_info != NULL) { - *oflow_info = 1; + *oflow_info = *str == '-' ? -1 : 1; } - type = IS_DOUBLE; + dp_or_e = -1; + goto process_double; } } else if (*ptr == '.' && ZEND_IS_DIGIT(ptr[1])) { process_double: @@ -2785,7 +2766,7 @@ process_double: } if (lval) { - *lval = ZEND_STRTOL(str, NULL, base); + *lval = ZEND_STRTOL(str, NULL, 10); } return IS_LONG; diff --git a/ext/standard/tests/array/array_udiff_assoc_variation.phpt b/ext/standard/tests/array/array_udiff_assoc_variation.phpt index 84e8841b2c4..465c5008fd2 100644 --- a/ext/standard/tests/array/array_udiff_assoc_variation.phpt +++ b/ext/standard/tests/array/array_udiff_assoc_variation.phpt @@ -14,7 +14,7 @@ include('compare_function.inc'); $key_compare_function = 'compare_function'; // Initialise all required variables -$arr1 = array("one" => "one", "02" => "two", '3' => "three", "four", "0.5" => 5, 6.0 => 6, "seven" => "0x7"); +$arr1 = array("one" => "one", "02" => "two", '3' => "three", "four", "0.5" => 5, 6.0 => 6, "seven" => "07"); $arr2 = array("one" => "one", "02" => "two", '3' => "three"); $arr3 = array("four", "0.5" => "five", 6 => 6, "seven" => 7); $arr4 = array("four", "0.5" => "five", 6 => 6, "seven" => 7); diff --git a/ext/standard/tests/general_functions/is_numeric.phpt b/ext/standard/tests/general_functions/is_numeric.phpt index 9857c94223b..415ce069e96 100644 --- a/ext/standard/tests/general_functions/is_numeric.phpt +++ b/ext/standard/tests/general_functions/is_numeric.phpt @@ -80,8 +80,6 @@ $numerics = array( ' 1', '2974394749328742328432', '-1e-2', - "0xff", - '0xff', "0123", '0123', "-0123", @@ -109,6 +107,7 @@ unset ($unset_var); // other types in a array $not_numerics = array( + "0x80001", "-0x80001", "+0x80001", "-0x80001.5", @@ -314,10 +313,6 @@ bool(true) bool(true) -- Iteration 76 -- bool(true) --- Iteration 77 -- -bool(true) --- Iteration 78 -- -bool(true) *** Testing is_numeric() on non numeric types *** -- Iteration 1 -- @@ -376,6 +371,8 @@ bool(false) bool(false) -- Iteration 28 -- bool(false) +-- Iteration 29 -- +bool(false) *** Testing error conditions *** diff --git a/ext/standard/tests/math/ceil_basic.phpt b/ext/standard/tests/math/ceil_basic.phpt index 679460533d6..e90afd33886 100644 --- a/ext/standard/tests/math/ceil_basic.phpt +++ b/ext/standard/tests/math/ceil_basic.phpt @@ -31,7 +31,6 @@ $values = array(0, "3.95E3", "-3.95E3", "039", - "0x5F", true, false, null, @@ -63,7 +62,6 @@ float(-10) float(3950) float(-3950) float(39) -float(95) float(1) float(0) float(0) diff --git a/ext/standard/tests/math/exp_basic.phpt b/ext/standard/tests/math/exp_basic.phpt index 9526c66fa4a..135705507cf 100644 --- a/ext/standard/tests/math/exp_basic.phpt +++ b/ext/standard/tests/math/exp_basic.phpt @@ -13,7 +13,6 @@ $values = array(10, "3950.5", "3.9505e3", "039", - "0x5F", true, false, null, @@ -58,14 +57,11 @@ float(INF) float(8.6593400423994E+16) -- Iteration 10 -- -float(1.811239082889E+41) - --- Iteration 11 -- float(2.718281828459) --- Iteration 12 -- +-- Iteration 11 -- float(1) --- Iteration 13 -- +-- Iteration 12 -- float(1) -===Done=== \ No newline at end of file +===Done=== diff --git a/ext/standard/tests/math/expm1_basic.phpt b/ext/standard/tests/math/expm1_basic.phpt index fa1d571db42..320b01a27dd 100644 --- a/ext/standard/tests/math/expm1_basic.phpt +++ b/ext/standard/tests/math/expm1_basic.phpt @@ -20,7 +20,6 @@ $values = array(10, "3950.5", "3.9505e3", "039", - "0x5F", true, false, null, @@ -66,14 +65,11 @@ float(INF) float(8.6593400423994E+16) -- Iteration 10 -- -float(1.811239082889E+41) - --- Iteration 11 -- float(1.718281828459) --- Iteration 12 -- +-- Iteration 11 -- float(0) --- Iteration 13 -- +-- Iteration 12 -- float(0) -===Done=== \ No newline at end of file +===Done=== diff --git a/ext/standard/tests/math/floor_basic.phpt b/ext/standard/tests/math/floor_basic.phpt index bbb8a2aa576..2b6d2f75c86 100644 --- a/ext/standard/tests/math/floor_basic.phpt +++ b/ext/standard/tests/math/floor_basic.phpt @@ -27,7 +27,6 @@ $values = array(0, "3.95E3", "-3.95E3", "039", - "0x5F", true, false, null, @@ -94,9 +93,6 @@ float(-3950) -- floor 039 -- float(39) --- floor 0x5F -- -float(95) - -- floor 1 -- float(1) @@ -105,4 +101,4 @@ float(0) -- floor -- float(0) -===Done=== \ No newline at end of file +===Done=== diff --git a/ext/standard/tests/math/mt_rand_basic.phpt b/ext/standard/tests/math/mt_rand_basic.phpt index 8b6b3cb2ce6..0f7b8a8b6e9 100644 --- a/ext/standard/tests/math/mt_rand_basic.phpt +++ b/ext/standard/tests/math/mt_rand_basic.phpt @@ -56,15 +56,13 @@ $min = array(true, false, null, "10", - "0x10", "10.5"); -// Eexepcted numerical equivalent of above non-numerics +// Expected numerical equivalent of above non-numerics $minval = array(1, 0, 0, 10, - 0, 10); for ($x = 0; $x < count($min); $x++) { for ($i = 0; $i < 100; $i++) { @@ -98,5 +96,4 @@ PASSED range min = 1 max = 100 PASSED range min = 0 max = 100 PASSED range min = 0 max = 100 PASSED range min = 10 max = 100 -PASSED range min = 0 max = 100 PASSED range min = 10 max = 100 diff --git a/ext/standard/tests/math/rand_basic.phpt b/ext/standard/tests/math/rand_basic.phpt index 525956017ef..8dc9fb862c6 100644 --- a/ext/standard/tests/math/rand_basic.phpt +++ b/ext/standard/tests/math/rand_basic.phpt @@ -56,7 +56,6 @@ $min = array(true, false, null, "10", - "0x10", "10.5"); // Eexepcted numerical equivalent of above non-numerics @@ -64,7 +63,6 @@ $minval = array(1, 0, 0, 10, - 0, 10); for ($x = 0; $x < count($min); $x++) { for ($i = 0; $i < 100; $i++) { @@ -99,5 +97,4 @@ PASSED range min = 1 max = 100 PASSED range min = 0 max = 100 PASSED range min = 0 max = 100 PASSED range min = 10 max = 100 -PASSED range min = 0 max = 100 PASSED range min = 10 max = 100 diff --git a/ext/standard/tests/math/round_basic.phpt b/ext/standard/tests/math/round_basic.phpt index dd4725f2441..d4b94ec0568 100644 --- a/ext/standard/tests/math/round_basic.phpt +++ b/ext/standard/tests/math/round_basic.phpt @@ -20,8 +20,7 @@ $values = array(123456789, 0x234567, 067777777, "1.234567", - "2.3456789e8", - "0x1234CDEF"); + "2.3456789e8"); $precision = array(2, 8, @@ -29,7 +28,6 @@ $precision = array(2, 04, 3.6, "2", - "0x03", "04", "3.6", "2.1e1", @@ -56,7 +54,6 @@ round: 123456789 ...with precision 4-> float(123456789) ...with precision 3.6-> float(123456789) ...with precision 2-> float(123456789) -...with precision 0x03-> float(123456789) ...with precision 04-> float(123456789) ...with precision 3.6-> float(123456789) ...with precision 2.1e1-> float(123456789) @@ -70,7 +67,6 @@ round: 123.456789 ...with precision 4-> float(123.4568) ...with precision 3.6-> float(123.457) ...with precision 2-> float(123.46) -...with precision 0x03-> float(123.457) ...with precision 04-> float(123.4568) ...with precision 3.6-> float(123.457) ...with precision 2.1e1-> float(123.456789) @@ -84,7 +80,6 @@ round: -4.5679123 ...with precision 4-> float(-4.5679) ...with precision 3.6-> float(-4.568) ...with precision 2-> float(-4.57) -...with precision 0x03-> float(-4.568) ...with precision 04-> float(-4.5679) ...with precision 3.6-> float(-4.568) ...with precision 2.1e1-> float(-4.5679123) @@ -98,7 +93,6 @@ round: 12300 ...with precision 4-> float(12300) ...with precision 3.6-> float(12300) ...with precision 2-> float(12300) -...with precision 0x03-> float(12300) ...with precision 04-> float(12300) ...with precision 3.6-> float(12300) ...with precision 2.1e1-> float(12300) @@ -112,7 +106,6 @@ round: -4567 ...with precision 4-> float(-4567) ...with precision 3.6-> float(-4567) ...with precision 2-> float(-4567) -...with precision 0x03-> float(-4567) ...with precision 04-> float(-4567) ...with precision 3.6-> float(-4567) ...with precision 2.1e1-> float(-4567) @@ -126,7 +119,6 @@ round: 2311527 ...with precision 4-> float(2311527) ...with precision 3.6-> float(2311527) ...with precision 2-> float(2311527) -...with precision 0x03-> float(2311527) ...with precision 04-> float(2311527) ...with precision 3.6-> float(2311527) ...with precision 2.1e1-> float(2311527) @@ -140,7 +132,6 @@ round: 14680063 ...with precision 4-> float(14680063) ...with precision 3.6-> float(14680063) ...with precision 2-> float(14680063) -...with precision 0x03-> float(14680063) ...with precision 04-> float(14680063) ...with precision 3.6-> float(14680063) ...with precision 2.1e1-> float(14680063) @@ -154,7 +145,6 @@ round: 1.234567 ...with precision 4-> float(1.2346) ...with precision 3.6-> float(1.235) ...with precision 2-> float(1.23) -...with precision 0x03-> float(1.235) ...with precision 04-> float(1.2346) ...with precision 3.6-> float(1.235) ...with precision 2.1e1-> float(1.234567) @@ -168,25 +158,10 @@ round: 2.3456789e8 ...with precision 4-> float(234567890) ...with precision 3.6-> float(234567890) ...with precision 2-> float(234567890) -...with precision 0x03-> float(234567890) ...with precision 04-> float(234567890) ...with precision 3.6-> float(234567890) ...with precision 2.1e1-> float(234567890) ...with precision -> float(234567890) ...with precision 1-> float(234567890) ...with precision -> float(234567890) -round: 0x1234CDEF -...with precision 2-> float(305450479) -...with precision 8-> float(305450479) -...with precision 3-> float(305450479) -...with precision 4-> float(305450479) -...with precision 3.6-> float(305450479) -...with precision 2-> float(305450479) -...with precision 0x03-> float(305450479) -...with precision 04-> float(305450479) -...with precision 3.6-> float(305450479) -...with precision 2.1e1-> float(305450479) -...with precision -> float(305450479) -...with precision 1-> float(305450479) -...with precision -> float(305450479) -===Done=== \ No newline at end of file +===Done=== diff --git a/ext/standard/tests/strings/hebrev_variation2.phpt b/ext/standard/tests/strings/hebrev_variation2.phpt index 501791f9e5d..5698cde793c 100644 --- a/ext/standard/tests/strings/hebrev_variation2.phpt +++ b/ext/standard/tests/strings/hebrev_variation2.phpt @@ -259,18 +259,10 @@ string(109) ".The hebrev function converts logical Hebrew text to visual text .The function tries to avoid breaking words " -- Iteration 23 -- -string(109) "textual vis -to -textrew Heb -icallog -ertsconvion unctf -brevhe -.Therds -wo -kingbreaoid av -to -riest -tionfuncThe . + +Notice: A non well formed numeric value encountered in %s on line %d +string(109) ".The hebrev function converts logical Hebrew text to visual text +.The function tries to avoid breaking words " -- Iteration 24 -- @@ -288,4 +280,4 @@ string(109) ".The hebrev function converts logical Hebrew text to visual text string(109) ".The hebrev function converts logical Hebrew text to visual text .The function tries to avoid breaking words " -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/standard/tests/strings/hebrevc_variation2.phpt b/ext/standard/tests/strings/hebrevc_variation2.phpt index 373cf806fe6..e6a6013931f 100644 --- a/ext/standard/tests/strings/hebrevc_variation2.phpt +++ b/ext/standard/tests/strings/hebrevc_variation2.phpt @@ -381,29 +381,13 @@ string(241) ".The hebrevcc function converts logical Hebrew text to visual text< .The function tries to avoid breaking words
" -- Iteration 23 -- -string(349) "textual vis
-to
-textrew Heb
-icallog
-ertsconvion unctf
-evcchebrThe .
-inesnewlrts onvec
-it
-thatnce feredif
-the
-withc() brevhe
-to
-ilarsim
-is
-tionfunchis ) T
-(
-' -
-ordsw
-kingbreaoid av
-to
-riest
-tionfuncThe .
+ +Notice: A non well formed numeric value encountered in %s on line %d +string(241) ".The hebrevcc function converts logical Hebrew text to visual text
+) This function is similar to hebrevc() with the difference that it converts newlines
+ +.'
+.The function tries to avoid breaking words
" -- Iteration 24 -- diff --git a/ext/standard/tests/strings/money_format_variation2.phpt b/ext/standard/tests/strings/money_format_variation2.phpt index 01fd44d66cb..6e01bf03ddd 100644 --- a/ext/standard/tests/strings/money_format_variation2.phpt +++ b/ext/standard/tests/strings/money_format_variation2.phpt @@ -156,6 +156,8 @@ NULL Warning: money_format() expects parameter 2 to be float, string given in %s on line %d NULL -- Iteration 21 -- + +Notice: A non well formed numeric value encountered in %s on line %d string -- Iteration 22 -- diff --git a/ext/standard/tests/strings/str_pad_variation4.phpt b/ext/standard/tests/strings/str_pad_variation4.phpt index 124d064576c..585d79edb3d 100644 --- a/ext/standard/tests/strings/str_pad_variation4.phpt +++ b/ext/standard/tests/strings/str_pad_variation4.phpt @@ -132,7 +132,9 @@ NULL -- Iteration 12 -- string(20) "****Test string*****" -- Iteration 13 -- -string(20) "****Test string*****" + +Notice: A non well formed numeric value encountered in %s on line %d +string(20) "*********Test string" -- Iteration 14 -- string(20) "****Test string*****" -- Iteration 15 --