Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 12e1d30

Browse files
authored
gh-111178: fix UBSan failures in Objects/floatobject.c (GH-129776)
fix UBSan failures for `PyFloatObject`
1 parent 624b93e commit 12e1d30

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

Objects/floatobject.c

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,9 @@ _Py_convert_int_to_double(PyObject **v, double *dbl)
369369
}
370370

371371
static PyObject *
372-
float_repr(PyFloatObject *v)
372+
float_repr(PyObject *op)
373373
{
374+
PyFloatObject *v = _PyFloat_CAST(op);
374375
PyObject *result;
375376
char *buf;
376377

@@ -579,9 +580,10 @@ float_richcompare(PyObject *v, PyObject *w, int op)
579580
}
580581

581582
static Py_hash_t
582-
float_hash(PyFloatObject *v)
583+
float_hash(PyObject *op)
583584
{
584-
return _Py_HashDouble((PyObject *)v, v->ob_fval);
585+
PyFloatObject *v = _PyFloat_CAST(op);
586+
return _Py_HashDouble(op, v->ob_fval);
585587
}
586588

587589
static PyObject *
@@ -851,20 +853,23 @@ float_pow(PyObject *v, PyObject *w, PyObject *z)
851853
#undef DOUBLE_IS_ODD_INTEGER
852854

853855
static PyObject *
854-
float_neg(PyFloatObject *v)
856+
float_neg(PyObject *op)
855857
{
858+
PyFloatObject *v = _PyFloat_CAST(op);
856859
return PyFloat_FromDouble(-v->ob_fval);
857860
}
858861

859862
static PyObject *
860-
float_abs(PyFloatObject *v)
863+
float_abs(PyObject *op)
861864
{
865+
PyFloatObject *v = _PyFloat_CAST(op);
862866
return PyFloat_FromDouble(fabs(v->ob_fval));
863867
}
864868

865869
static int
866-
float_bool(PyFloatObject *v)
870+
float_bool(PyObject *op)
867871
{
872+
PyFloatObject *v = _PyFloat_CAST(op);
868873
return v->ob_fval != 0.0;
869874
}
870875

@@ -1206,7 +1211,7 @@ float_hex_impl(PyObject *self)
12061211
CONVERT_TO_DOUBLE(self, x);
12071212

12081213
if (isnan(x) || isinf(x))
1209-
return float_repr((PyFloatObject *)self);
1214+
return float_repr(self);
12101215

12111216
if (x == 0.0) {
12121217
if (copysign(1.0, x) == -1.0)
@@ -1651,7 +1656,7 @@ float_subtype_new(PyTypeObject *type, PyObject *x)
16511656
}
16521657

16531658
static PyObject *
1654-
float_vectorcall(PyObject *type, PyObject * const*args,
1659+
float_vectorcall(PyObject *type, PyObject *const *args,
16551660
size_t nargsf, PyObject *kwnames)
16561661
{
16571662
if (!_PyArg_NoKwnames("float", kwnames)) {
@@ -1771,13 +1776,13 @@ float___getformat___impl(PyTypeObject *type, const char *typestr)
17711776

17721777

17731778
static PyObject *
1774-
float_getreal(PyObject *v, void *closure)
1779+
float_getreal(PyObject *v, void *Py_UNUSED(closure))
17751780
{
17761781
return float_float(v);
17771782
}
17781783

17791784
static PyObject *
1780-
float_getimag(PyObject *v, void *closure)
1785+
float_getimag(PyObject *Py_UNUSED(v), void *Py_UNUSED(closure))
17811786
{
17821787
return PyFloat_FromDouble(0.0);
17831788
}
@@ -1829,11 +1834,11 @@ static PyMethodDef float_methods[] = {
18291834

18301835
static PyGetSetDef float_getset[] = {
18311836
{"real",
1832-
float_getreal, (setter)NULL,
1837+
float_getreal, NULL,
18331838
"the real part of a complex number",
18341839
NULL},
18351840
{"imag",
1836-
float_getimag, (setter)NULL,
1841+
float_getimag, NULL,
18371842
"the imaginary part of a complex number",
18381843
NULL},
18391844
{NULL} /* Sentinel */
@@ -1847,10 +1852,10 @@ static PyNumberMethods float_as_number = {
18471852
float_rem, /* nb_remainder */
18481853
float_divmod, /* nb_divmod */
18491854
float_pow, /* nb_power */
1850-
(unaryfunc)float_neg, /* nb_negative */
1855+
float_neg, /* nb_negative */
18511856
float_float, /* nb_positive */
1852-
(unaryfunc)float_abs, /* nb_absolute */
1853-
(inquiry)float_bool, /* nb_bool */
1857+
float_abs, /* nb_absolute */
1858+
float_bool, /* nb_bool */
18541859
0, /* nb_invert */
18551860
0, /* nb_lshift */
18561861
0, /* nb_rshift */
@@ -1881,16 +1886,16 @@ PyTypeObject PyFloat_Type = {
18811886
"float",
18821887
sizeof(PyFloatObject),
18831888
0,
1884-
(destructor)float_dealloc, /* tp_dealloc */
1889+
float_dealloc, /* tp_dealloc */
18851890
0, /* tp_vectorcall_offset */
18861891
0, /* tp_getattr */
18871892
0, /* tp_setattr */
18881893
0, /* tp_as_async */
1889-
(reprfunc)float_repr, /* tp_repr */
1894+
float_repr, /* tp_repr */
18901895
&float_as_number, /* tp_as_number */
18911896
0, /* tp_as_sequence */
18921897
0, /* tp_as_mapping */
1893-
(hashfunc)float_hash, /* tp_hash */
1898+
float_hash, /* tp_hash */
18941899
0, /* tp_call */
18951900
0, /* tp_str */
18961901
PyObject_GenericGetAttr, /* tp_getattro */
@@ -1916,7 +1921,7 @@ PyTypeObject PyFloat_Type = {
19161921
0, /* tp_init */
19171922
0, /* tp_alloc */
19181923
float_new, /* tp_new */
1919-
.tp_vectorcall = (vectorcallfunc)float_vectorcall,
1924+
.tp_vectorcall = float_vectorcall,
19201925
.tp_version_tag = _Py_TYPE_VERSION_FLOAT,
19211926
};
19221927

0 commit comments

Comments
 (0)