Kaydet (Commit) e23cde2f authored tarafından Guido van Rossum's avatar Guido van Rossum

Avoid overflow if possible in calculations for range(); report

unavoidable overflow as OverflowError.
üst 5a0ca4e5
...@@ -1415,13 +1415,34 @@ builtin_range(self, args) ...@@ -1415,13 +1415,34 @@ builtin_range(self, args)
PyErr_SetString(PyExc_ValueError, "zero step for range()"); PyErr_SetString(PyExc_ValueError, "zero step for range()");
return NULL; return NULL;
} }
/* XXX ought to check overflow of subtraction */ /* A bit convoluted because this might overflow; due to Tim Peters */
if (istep > 0) if (istep > 0) {
n = (ihigh - ilow + istep - 1) / istep; if (ihigh <= ilow)
else n = 0;
n = (ihigh - ilow + istep + 1) / istep; else {
if (n < 0) unsigned long hi = (unsigned long)ihigh;
n = 0; unsigned long lo = (unsigned long)ilow;
unsigned long diff = hi - lo - 1;
n = (long)(diff / istep + 1);
}
}
else {
/* But any errors in this branch are my own --Guido */
if (ihigh >= ilow)
n = 0;
else {
/* Swap lo and hi; use abs(istep) */
unsigned long hi = (unsigned long)ilow;
unsigned long lo = (unsigned long)ihigh;
unsigned long diff = hi - lo - 1;
n = (long)(diff / (-istep) + 1);
}
}
if (n < 0) {
PyErr_SetString(PyExc_OverflowError,
"range() has more than sys.maxint items");
return NULL;
}
v = PyList_New(n); v = PyList_New(n);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
......
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