diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2013-11-26 16:19:13 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2013-11-26 16:19:13 (GMT) |
commit | f45bbb62110a7bbcbbf45c1a52be6de7b791b189 (patch) | |
tree | 2c6aa2f504e8424b0ba29dacfc841b08daab7d0a /Lib | |
parent | 22dc4d5fa849d07d93c1f63d1a3e24058c4afab0 (diff) | |
download | cpython-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.py | 31 |
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 |