Kaydet (Commit) 34398184 authored tarafından Mark Dickinson's avatar Mark Dickinson

Issue #7406: Fix some occurrences of potential signed overflow in int

arithmetic.
üst 5a73ff81
...@@ -461,7 +461,8 @@ int_add(PyIntObject *v, PyIntObject *w) ...@@ -461,7 +461,8 @@ int_add(PyIntObject *v, PyIntObject *w)
register long a, b, x; register long a, b, x;
CONVERT_TO_LONG(v, a); CONVERT_TO_LONG(v, a);
CONVERT_TO_LONG(w, b); CONVERT_TO_LONG(w, b);
x = a + b; /* casts in the line below avoid undefined behaviour on overflow */
x = (long)((unsigned long)a + b);
if ((x^a) >= 0 || (x^b) >= 0) if ((x^a) >= 0 || (x^b) >= 0)
return PyInt_FromLong(x); return PyInt_FromLong(x);
return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w); return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
...@@ -473,7 +474,8 @@ int_sub(PyIntObject *v, PyIntObject *w) ...@@ -473,7 +474,8 @@ int_sub(PyIntObject *v, PyIntObject *w)
register long a, b, x; register long a, b, x;
CONVERT_TO_LONG(v, a); CONVERT_TO_LONG(v, a);
CONVERT_TO_LONG(w, b); CONVERT_TO_LONG(w, b);
x = a - b; /* casts in the line below avoid undefined behaviour on overflow */
x = (long)((unsigned long)a - b);
if ((x^a) >= 0 || (x^~b) >= 0) if ((x^a) >= 0 || (x^~b) >= 0)
return PyInt_FromLong(x); return PyInt_FromLong(x);
return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v, return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
...@@ -516,7 +518,8 @@ int_mul(PyObject *v, PyObject *w) ...@@ -516,7 +518,8 @@ int_mul(PyObject *v, PyObject *w)
CONVERT_TO_LONG(v, a); CONVERT_TO_LONG(v, a);
CONVERT_TO_LONG(w, b); CONVERT_TO_LONG(w, b);
longprod = a * b; /* casts in the next line avoid undefined behaviour on overflow */
longprod = (long)((unsigned long)a * b);
doubleprod = (double)a * (double)b; doubleprod = (double)a * (double)b;
doubled_longprod = (double)longprod; doubled_longprod = (double)longprod;
......
...@@ -1321,7 +1321,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -1321,7 +1321,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
register long a, b, i; register long a, b, i;
a = PyInt_AS_LONG(v); a = PyInt_AS_LONG(v);
b = PyInt_AS_LONG(w); b = PyInt_AS_LONG(w);
i = a + b; /* cast to avoid undefined behaviour
on overflow */
i = (long)((unsigned long)a + b);
if ((i^a) < 0 && (i^b) < 0) if ((i^a) < 0 && (i^b) < 0)
goto slow_add; goto slow_add;
x = PyInt_FromLong(i); x = PyInt_FromLong(i);
...@@ -1351,7 +1353,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -1351,7 +1353,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
register long a, b, i; register long a, b, i;
a = PyInt_AS_LONG(v); a = PyInt_AS_LONG(v);
b = PyInt_AS_LONG(w); b = PyInt_AS_LONG(w);
i = a - b; /* cast to avoid undefined behaviour
on overflow */
i = (long)((unsigned long)a - b);
if ((i^a) < 0 && (i^~b) < 0) if ((i^a) < 0 && (i^~b) < 0)
goto slow_sub; goto slow_sub;
x = PyInt_FromLong(i); x = PyInt_FromLong(i);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment