diff options
author | Damien George <damien.p.george@gmail.com> | 2016-03-29 22:07:15 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-03-29 22:07:15 +0100 |
commit | e1e7657277f0c3ea6a207fa7768110475a52c39c (patch) | |
tree | 8540f12b719175427e066d89f04a8f098f22c54b /tests/float | |
parent | 03b8bb7ec9f2da5829794ebef0394c0a69b4f643 (diff) | |
download | micropython-e1e7657277f0c3ea6a207fa7768110475a52c39c.tar.gz micropython-e1e7657277f0c3ea6a207fa7768110475a52c39c.zip |
py/formatfloat: Fix further cases of buffer overflow in formatting.
Includes extensive test cases to catch hopefully all cases where
buffer might overflow.
Diffstat (limited to 'tests/float')
-rw-r--r-- | tests/float/string_format_modulo2.py | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/float/string_format_modulo2.py b/tests/float/string_format_modulo2.py new file mode 100644 index 0000000000..d35f2a2c02 --- /dev/null +++ b/tests/float/string_format_modulo2.py @@ -0,0 +1,24 @@ +# test formatting floats with large precision, that it doesn't overflow the buffer + +def test(num, num_str): + if num == float('inf') or num == 0.0 and num_str != '0.0': + # skip numbers that overflow or underflow the FP precision + return + for kind in ('e', 'f', 'g'): + # check precision either side of the size of the buffer (32 bytes) + for prec in range(23, 36, 2): + fmt = '%.' + '%d' % prec + kind + s = fmt % num + check = abs(float(s) - num) + if num > 1: + check /= num + if check > 1e-6: + print('FAIL', num_str, fmt, s, len(s), check) + +# check pure zero +test(0.0, '0.0') + +# check most powers of 10, making sure to include exponents with 3 digits +for e in range(-101, 102): + num = pow(10, e) + test(num, '1e%d' % e) |