]> granicus.if.org Git - php/commitdiff
Throw ValueError instead of TypeError for malformed GMP number
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 4 Jan 2021 11:14:01 +0000 (12:14 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 4 Jan 2021 13:30:08 +0000 (14:30 +0100)
If the passed argument has correct type (string) but does not
have a well-formed value, throw ValueError instead of TypeError.

Closes GH-6572.

19 files changed:
ext/gmp/gmp.c
ext/gmp/tests/003.phpt
ext/gmp/tests/bug66872.phpt
ext/gmp/tests/bug80560.phpt
ext/gmp/tests/gmp_abs.phpt
ext/gmp/tests/gmp_and.phpt
ext/gmp/tests/gmp_com.phpt
ext/gmp/tests/gmp_fact.phpt
ext/gmp/tests/gmp_init.phpt
ext/gmp/tests/gmp_intval.phpt
ext/gmp/tests/gmp_mod.phpt
ext/gmp/tests/gmp_neg.phpt
ext/gmp/tests/gmp_nextprime.phpt
ext/gmp/tests/gmp_or.phpt
ext/gmp/tests/gmp_random_seed.phpt
ext/gmp/tests/gmp_sign.phpt
ext/gmp/tests/gmp_strval.phpt
ext/gmp/tests/gmp_sub.phpt
ext/gmp/tests/gmp_xor.phpt

index 5bccdeca5c357a02157988d3091370bd99433d61..b7ba99fbdca6211967b6a6d1d7e51271dda0f8aa 100644 (file)
@@ -614,7 +614,7 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
                                        "Cannot convert variable to GMP, it is not an integer string");
                                return FAILURE;
                        }
-                       zend_argument_type_error(arg_pos, "is not an integer string");
+                       zend_argument_value_error(arg_pos, "is not an integer string");
                        return FAILURE;
                }
 
index 70613eb94b0464afff67926f8eb5d045bc11709e..4705827dd22c99d735e22895c6989b2ab1e39654 100644 (file)
@@ -25,7 +25,7 @@ Check for number base recognition
         $test[] = gmp_init("0x4d2", 16);
         try {
             $test[] = gmp_init("4d2");
-        } catch (\TypeError $e) {
+        } catch (\ValueError $e) {
             echo $e->getMessage() . \PHP_EOL;
         }
         $test[] = gmp_init("4d2", 16);
index e4090176de538fdfdfe4964ffb0abfe388825ffa..785ab7312183114d1b5bd5fc102ef1ae6146ac48 100644 (file)
@@ -7,7 +7,7 @@ Bug #66872: Crash when passing string to gmp_testbit
 
 try {
     var_dump(gmp_testbit("abc", 1));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index f1bf7dc0d7b7af7f684bef514bce6835f13d89c9..bed82845fcb66486b7da7f7d4926ce3bd5a1b017 100644 (file)
@@ -15,9 +15,6 @@ $functions1 = [
     'gmp_fact',
     'gmp_sqrt',
     'gmp_sqrtrem',
-    'gmp_root',
-    'gmp_rootrem',
-    'gmp_pow',
     'gmp_perfect_square',
     'gmp_perfect_power',
     'gmp_prob_prime',
@@ -25,12 +22,16 @@ $functions1 = [
     'gmp_random_seed',
     'gmp_popcount',
     'gmp_com',
+    'gmp_nextprime',
 ];
 $functions1_need_int_2 = [
     'gmp_testbit',
     'gmp_scan0',
     'gmp_scan1',
     'gmp_binomial',
+    'gmp_root',
+    'gmp_rootrem',
+    'gmp_pow',
 ];
 $functions2 = [
     'gmp_add',
@@ -55,7 +56,6 @@ $functions2 = [
     'gmp_or',
     'gmp_xor',
     'gmp_hamdist',
-    'gmp_nextprime',
 ];
 $functions3 = [
     'gmp_powm',
@@ -65,24 +65,24 @@ echo 'Explicit base with gmp_init:', \PHP_EOL;
 echo 'Hexadecimal', \PHP_EOL;
 try {
     var_dump(gmp_init('0X', 16));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage(), \PHP_EOL;
 }
 try {
     var_dump(gmp_init('0x', 16));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage(), \PHP_EOL;
 }
 
 echo 'Binary', \PHP_EOL;
 try {
     var_dump(gmp_init('0B', 2));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage(), \PHP_EOL;
 }
 try {
     var_dump(gmp_init('0b', 2));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage(), \PHP_EOL;
 }
 
@@ -91,121 +91,121 @@ foreach ($functions1 as $function) {
     try {
         $function('0B');
         echo $function, ' failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0b');
         echo $function, ' failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0X');
         echo $function, ' failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0x');
         echo $function, ' failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
 }
 foreach ($functions1_need_int_2 as $function) {
     try {
         $function('0B', 1);
         echo $function, ' failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0b', 1);
         echo $function, ' failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0X', 1);
         echo $function, ' failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0x', 1);
         echo $function, ' failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
 }
 foreach ($functions2 as $function) {
     try {
         $function('0B', 1);
         echo $function, ' arg 1 failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0b', 1);
         echo $function, ' arg 1 failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0X', 1);
         echo $function, ' arg 1 failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0x', 1);
         echo $function, ' arg 1 failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0B');
         echo $function, ' arg 2 failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0b');
         echo $function, ' arg 2 failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0X');
         echo $function, ' arg 2 failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0x');
         echo $function, ' arg 2 failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
 }
 foreach ($functions3 as $function) {
     try {
         $function('0B', 1, 1);
         echo $function, ' arg 1 failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0b', 1, 1);
         echo $function, ' arg 1 failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0X', 1, 1);
         echo $function, ' arg 1 failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function('0x', 1, 1);
         echo $function, ' arg 1 failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0B', 1);
         echo $function, ' arg 2 failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0b', 1);
         echo $function, ' arg 2 failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0X', 1);
         echo $function, ' arg 2 failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, '0x', 1);
         echo $function, ' arg 2 failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, 1, '0B');
         echo $function, ' arg 3 failed with 0B', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, 1, '0b');
         echo $function, ' arg 3 failed with 0b', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, 1, '0X');
         echo $function, ' arg 3 failed with 0X', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
     try {
         $function(1, 1, '0x');
         echo $function, ' arg 3 failed with 0x', \PHP_EOL;
-    } catch (\TypeError) { }
+    } catch (\ValueError) { }
 }
 
 echo "Done\n";
index 57b0dde25c8212871a1f4a909614cfc1353e4c5f..73fc840c9f4702067ad657557d5400b28c8a706d 100644 (file)
@@ -7,7 +7,7 @@ gmp_abs() basic tests
 
 try {
     var_dump(gmp_strval(gmp_abs("")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 var_dump(gmp_strval(gmp_abs("0")));
@@ -24,13 +24,13 @@ var_dump(gmp_strval(gmp_abs("0000")));
 try {
     // Base 8
     var_dump(gmp_strval(gmp_abs("09876543")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
     // Base 8
     var_dump(gmp_strval(gmp_abs("-099987654")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index aa40a12aa4b54aadd401583078d64b4a659ec719..2bd7deeff07db5c3aba92b499ffbe5b89ac6f260 100644 (file)
@@ -13,7 +13,7 @@ var_dump(gmp_strval(gmp_and(4545, -20)));
 
 try {
     var_dump(gmp_strval(gmp_and("test", "no test")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index 1cc0aae428e4a90401fe04b0b1a6c48f7bfe9e7f..1b0a0a209718ce2cc6ad27861de65bdc4b75c183 100644 (file)
@@ -9,7 +9,7 @@ var_dump(gmp_strval(gmp_com(0)));
 var_dump(gmp_strval(gmp_com("0")));
 try {
     var_dump(gmp_strval(gmp_com("test")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 var_dump(gmp_strval(gmp_com("2394876545678")));
index d2b98f78c28c906cd7a0a92eed3eeaeb91d303ed..dd3b75a17f04d18380ac82661da1b4c79b161127 100644 (file)
@@ -8,7 +8,7 @@ gmp_fact() basic tests
 var_dump(gmp_strval(gmp_fact(0)));
 try {
     var_dump(gmp_strval(gmp_fact("")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 var_dump(gmp_strval(gmp_fact("0")));
index 045ddc668e38ef3727224a579e2f8760681817ed..630b73013e36e2e395c18b20567967d7fc83a10a 100644 (file)
@@ -15,17 +15,17 @@ try {
 
 try {
     var_dump(gmp_init("",36));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
     var_dump(gmp_init("foo",3));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
     var_dump(gmp_strval(gmp_init("993247326237679187178",3)));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index 4642d9ec5229e3ef80a32f88f025d3d9e9180c3a..6fcb351404ceb339cf9b225819c3e843ce104cf9 100644 (file)
@@ -16,7 +16,7 @@ var_dump(gmp_intval($g));
 
 try {
     var_dump(gmp_intval(""));
-} catch (TypeError $e) {
+} catch (ValueError $e) {
     echo $e->getMessage(), "\n";
 }
 try {
@@ -31,7 +31,7 @@ try {
 }
 try {
     var_dump(gmp_intval("1.0001"));
-} catch (TypeError $e) {
+} catch (ValueError $e) {
     echo $e->getMessage(), "\n";
 }
 
index a20f871df9561d80a661185aedcef20988d27e5f..29cddf3ff6c89e9ff0e69d96d41c4314ed904663 100644 (file)
@@ -7,7 +7,7 @@ gmp_mod tests()
 
 try {
     var_dump(gmp_mod("",""));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 var_dump(gmp_mod(0,1));
index bed25722bb52ee91561ee735fe8df16c46f2ca27..87ef950c820e41e980b1c93779b1ee8e3e7f910e 100644 (file)
@@ -12,7 +12,7 @@ var_dump(gmp_intval(gmp_neg("-1")));
 
 try {
     var_dump(gmp_intval(gmp_neg("")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index 7d252aee6598558f40b20d92b5a988aeade7b0ba..004a099e807841eea444e7756b593039cab29531 100644 (file)
@@ -25,7 +25,7 @@ try {
 try {
     $n = gmp_nextprime("");
     var_dump(gmp_strval($n));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
index 75f631e326817eab1579414c7e93da27381a0bba..5a4059c86457d2fff19865006ce602ad9d2cd5c5 100644 (file)
@@ -13,7 +13,7 @@ var_dump(gmp_strval(gmp_or(4545, -20)));
 
 try {
     var_dump(gmp_strval(gmp_or("test", "no test")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index c4dc23e2595bea708334209476e6483546bb8f21..4b505bfde3d00ce0c5e2aaf40a06f9b406ff3b31 100644 (file)
@@ -108,7 +108,7 @@ var_dump(gmp_strval(gmp_random_range(-10000, 0)));
 // standard non conversion error
 try {
     var_dump(gmp_random_seed('not a number'));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
index 7d7e67177c996496a93f2136b8b081f7d454aa90..125b64fcb1aa1fec794320fa96851f64fc93248b 100644 (file)
@@ -13,13 +13,13 @@ var_dump(gmp_sign("-34535345345"));
 
 try {
     var_dump(gmp_sign("+34534573457345"));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
     $n = gmp_init("098909878976786545");
     var_dump(gmp_sign($n));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
index 3aa3e372a9fa4c4bf8aad375ab5a0c080c1b0ed5..b03f0bcba10363cb5d657940af29e3750fb2289e 100644 (file)
@@ -7,7 +7,7 @@ gmp_strval() tests
 
 try {
     var_dump(gmp_strval(""));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
index a1e5a6158305c2ac84debac9bf640eaac4c2c3f7..feec6cc0170c504dce7035e6523d366913f0ecb3 100644 (file)
@@ -7,7 +7,7 @@ gmp_sub() tests
 
 try {
     var_dump(gmp_sub("", ""));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
index eb99f8c99c9ab79fa3d80db9e0b6ff867af4bf92..a6a5b170ac7147f887f1d1c714114c063795a66b 100644 (file)
@@ -13,7 +13,7 @@ var_dump(gmp_strval(gmp_xor(4545, -20)));
 
 try {
     var_dump(gmp_strval(gmp_xor("test", "no test")));
-} catch (\TypeError $e) {
+} catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }