mirror of https://github.com/python/cpython
Merged revisions 76629 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r76629 | mark.dickinson | 2009-12-02 17:33:41 +0000 (Wed, 02 Dec 2009) | 3 lines Issue #7406: Fix some occurrences of potential signed overflow in int arithmetic. ........
This commit is contained in:
parent
0d124c29e2
commit
6df863c93a
|
@ -465,7 +465,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);
|
||||||
|
@ -477,7 +478,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,
|
||||||
|
@ -520,7 +522,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;
|
||||||
|
|
||||||
|
|
|
@ -1191,7 +1191,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);
|
||||||
|
@ -1221,7 +1223,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);
|
||||||
|
|
Loading…
Reference in New Issue