Skip to content

Commit ff9d834

Browse files
committed
Fix crash when specify invalid base for RR and RIF construction
1 parent 209ae4c commit ff9d834

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/sage/rings/convert/mpfi.pyx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,42 @@ cdef int mpfi_set_sage(mpfi_ptr re, mpfi_ptr im, x, field, int base) except -1:
7272
imaginary component is 0.
7373
7474
- in all other cases: raise an exception.
75+
76+
TESTS::
77+
78+
sage: RIF('0xabc')
79+
Traceback (most recent call last):
80+
...
81+
TypeError: unable to convert '0xabc' to real interval
82+
sage: RIF("0x123.e1", base=0) # rel tol 1e-12
83+
291.87890625000000?
84+
sage: RIF("0x123.@1", base=0) # rel tol 1e-12
85+
4656
86+
sage: RIF("1Xx", base=36) # rel tol 1e-12
87+
2517
88+
sage: RIF("-1Xx@-10", base=62) # rel tol 1e-12
89+
-7.088054920481391?e-15
90+
sage: RIF("1", base=1)
91+
Traceback (most recent call last):
92+
...
93+
ValueError: base (=1) must be 0 or between 2 and 62
94+
sage: RIF("1", base=-1)
95+
Traceback (most recent call last):
96+
...
97+
ValueError: base (=-1) must be 0 or between 2 and 62
98+
sage: RIF("1", base=63)
99+
Traceback (most recent call last):
100+
...
101+
ValueError: base (=63) must be 0 or between 2 and 62
75102
"""
76103
cdef RealIntervalFieldElement ri
77104
cdef ComplexIntervalFieldElement zi
78105
cdef ComplexNumber zn
79106
cdef ComplexDoubleElement zd
80107
cdef bytes s
81108

109+
if base != 0 and (base < 2 or base > 62):
110+
raise ValueError(f"base (={base}) must be 0 or between 2 and 62")
82111
if im is not NULL and isinstance(x, tuple):
83112
# For complex numbers, interpret tuples as real/imag parts
84113
if len(x) != 2:

src/sage/rings/real_mpfr.pyx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,6 +1437,33 @@ cdef class RealNumber(sage.structure.element.RingElement):
14371437
14381438
sage: RealNumber('1_3.1e-32_45')
14391439
1.31000000000000e-3244
1440+
1441+
Test conversion from base different from `10`::
1442+
1443+
sage: RR('0xabc')
1444+
Traceback (most recent call last):
1445+
...
1446+
TypeError: unable to convert '0xabc' to a real number
1447+
sage: RR("0x123.e1", base=0) # rel tol 1e-12
1448+
291.878906250000
1449+
sage: RR("0x123.@1", base=0) # rel tol 1e-12
1450+
4656.00000000000
1451+
sage: RR("1Xx", base=36) # rel tol 1e-12
1452+
2517.00000000000
1453+
sage: RR("-1Xx@-10", base=62) # rel tol 1e-12
1454+
-7.08805492048139e-15
1455+
sage: RR("1", base=1)
1456+
Traceback (most recent call last):
1457+
...
1458+
ValueError: base (=1) must be 0 or between 2 and 62
1459+
sage: RR("1", base=-1)
1460+
Traceback (most recent call last):
1461+
...
1462+
ValueError: base (=-1) must be 0 or between 2 and 62
1463+
sage: RR("1", base=63)
1464+
Traceback (most recent call last):
1465+
...
1466+
ValueError: base (=63) must be 0 or between 2 and 62
14401467
"""
14411468
if x is not None:
14421469
self._set(x, base)
@@ -1485,6 +1512,8 @@ cdef class RealNumber(sage.structure.element.RingElement):
14851512
# Real Numbers are supposed to be immutable.
14861513
cdef RealField_class parent
14871514
parent = self._parent
1515+
if base != 0 and (base < 2 or base > 62):
1516+
raise ValueError(f"base (={base}) must be 0 or between 2 and 62")
14881517
if isinstance(x, RealNumber):
14891518
if isinstance(x, RealLiteral):
14901519
s = (<RealLiteral>x).literal

0 commit comments

Comments
 (0)