summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2013-11-26 16:19:13 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2013-11-26 16:19:13 (GMT)
commitf45bbb62110a7bbcbbf45c1a52be6de7b791b189 (patch)
tree2c6aa2f504e8424b0ba29dacfc841b08daab7d0a /Lib
parent22dc4d5fa849d07d93c1f63d1a3e24058c4afab0 (diff)
downloadcpython-f45bbb62110a7bbcbbf45c1a52be6de7b791b189.zip
cpython-f45bbb62110a7bbcbbf45c1a52be6de7b791b189.tar.gz
cpython-f45bbb62110a7bbcbbf45c1a52be6de7b791b189.tar.bz2
Issue #19638: Raise ValueError instead of crashing when converting billion character strings to float.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_strtod.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/Lib/test/test_strtod.py b/Lib/test/test_strtod.py
index 7a42a89..eee8a23 100644
--- a/Lib/test/test_strtod.py
+++ b/Lib/test/test_strtod.py
@@ -248,6 +248,37 @@ class StrtodTests(unittest.TestCase):
else:
assert False, "expected ValueError"
+ @test.support.bigmemtest(size=5 * test.support._1G, memuse=1, dry_run=False)
+ def test_oversized_digit_strings(self, maxsize):
+ # Input string whose length doesn't fit in an INT.
+ s = "1." + "1" * int(2.2e9)
+ with self.assertRaises(ValueError):
+ float(s)
+ del s
+
+ s = "0." + "0" * int(2.2e9) + "1"
+ with self.assertRaises(ValueError):
+ float(s)
+ del s
+
+ def test_large_exponents(self):
+ # Verify that the clipping of the exponent in strtod doesn't affect the
+ # output values.
+ def positive_exp(n):
+ """ Long string with value 1.0 and exponent n"""
+ return '0.{}1e+{}'.format('0'*(n-1), n)
+
+ def negative_exp(n):
+ """ Long string with value 1.0 and exponent -n"""
+ return '1{}e-{}'.format('0'*n, n)
+
+ self.assertEqual(float(positive_exp(10000)), 1.0)
+ self.assertEqual(float(positive_exp(20000)), 1.0)
+ self.assertEqual(float(positive_exp(30000)), 1.0)
+ self.assertEqual(float(negative_exp(10000)), 1.0)
+ self.assertEqual(float(negative_exp(20000)), 1.0)
+ self.assertEqual(float(negative_exp(30000)), 1.0)
+
def test_particular(self):
# inputs that produced crashes or incorrectly rounded results with
# previous versions of dtoa.c, for various reasons