python / cpython

The Python programming language
https://www.python.org
Other
62.15k stars 29.86k forks source link

Optional support for ieee contexts in the decimal module doesn't work #122081

Closed skirpichev closed 2 weeks ago

skirpichev commented 1 month ago

Crash report

What happened?

Reproducer:

$ ./configure CFLAGS=-DEXTRA_FUNCTIONALITY -q && make -s
configure: WARNING: no system libmpdecimal found; falling back to bundled libmpdecimal (deprecated and scheduled for removal in Python 3.15)
In function ‘word_to_string’,
    inlined from ‘coeff_to_string’ at ./Modules/_decimal/libmpdec/io.c:411:13,
    inlined from ‘_mpd_to_string’ at ./Modules/_decimal/libmpdec/io.c:612:18:
./Modules/_decimal/libmpdec/io.c:349:40: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
  349 |         if (s == dot) *s++ = '.'; *s++ = '0' + (char)(x / d); x %= d
      |                                   ~~~~~^~~~~~~~~~~~~~~~~~~~~
./Modules/_decimal/libmpdec/io.c:360:14: note: in expansion of macro ‘EXTRACT_DIGIT’
  360 |     case 15: EXTRACT_DIGIT(s, x, 100000000000000ULL, dot);
      |              ^~~~~~~~~~~~~
[... and similar warnings from issue #108562, hardly relevant]
Checked 112 modules (34 built-in, 77 shared, 1 n/a on linux-x86_64, 0 disabled, 0 missing, 0 failed on import)
$ ./python 
Python 3.14.0a0 (heads/main:cecaceea31, Jul 19 2024, 05:34:00) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from decimal import *
>>> IEEEContext(11)
Traceback (most recent call last):
  File "<python-input-1>", line 1, in <module>
    IEEEContext(11)
    ~~~~~~~~~~~^^^^
ValueError: argument must be a multiple of 32, with a maximum of 512
>>> IEEEContext(1024)
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    IEEEContext(1024)
    ~~~~~~~~~~~^^^^^^
ValueError: argument must be a multiple of 32, with a maximum of 512
>>> IEEEContext(512)  # oops
Segmentation fault

There are tests (decorated by @requires_extra_functionality) for this, but it seems nobody (including build bots) run this a long time. These tests are broken too (crash).

I'll provide a patch.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Output from running 'python -VV' on the command line:

Python 3.14.0a0 (heads/fix-decimal-extra:c8d2630995, Jul 21 2024, 10:20:04) [GCC 12.2.0]

Linked PRs

skirpichev commented 1 month ago

PR is ready for review: https://github.com/python/cpython/pull/122082

skirpichev commented 2 weeks ago

Gentle ping (per devguide).

picnixz commented 2 weeks ago

@skirpichev As a mathematician, I'm always interested in your PRs so feel free to ping me / request a review in general!

skirpichev commented 2 weeks ago

Thanks, @picnixz! When it does make sense for you, feel free to ask me for review.

picnixz commented 2 weeks ago

Closing since completed in #122082 and backported in #123136.

picnixz commented 2 weeks ago

Re-opening because the 3.12 backport is actually missing.

@skirpichev @kumaraditya303 Either of you should do the 3.12 backport manually since it failed.

skirpichev commented 2 weeks ago

I'm working on this. Probably, that backport isn't required.

skirpichev commented 2 weeks ago

Yeah, it works without the patch. @picnixz, you can remove label.