Issue a warning when int('0...', 0) returns an int with the sign

folded; this will change in Python 2.4.  On a 32-bit machine, this
happens for 0x80000000 through 0xffffffff, and for octal constants in
the same value range.  No warning is issued if an explicit base is
given, *or* if the string contains a sign (since in those cases no
sign folding ever happens).
This commit is contained in:
Guido van Rossum 2003-02-12 20:48:22 +00:00
parent 3288f592cb
commit 47710656e5
2 changed files with 20 additions and 3 deletions

View file

@ -187,17 +187,22 @@ PyInt_FromString(char *s, char **pend, int base)
char *end;
long x;
char buffer[256]; /* For errors */
int warn = 0;
if ((base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36");
PyErr_SetString(PyExc_ValueError,
"int() base must be >= 2 and <= 36");
return NULL;
}
while (*s && isspace(Py_CHARMASK(*s)))
s++;
errno = 0;
if (base == 0 && s[0] == '0')
if (base == 0 && s[0] == '0') {
x = (long) PyOS_strtoul(s, &end, base);
if (x < 0)
warn = 1;
}
else
x = PyOS_strtol(s, &end, base);
if (end == s || !isalnum(Py_CHARMASK(end[-1])))
@ -216,6 +221,11 @@ PyInt_FromString(char *s, char **pend, int base)
return NULL;
return PyLong_FromString(s, pend, base);
}
if (warn) {
if (PyErr_Warn(PyExc_FutureWarning,
"int('0...', 0): sign will change in Python 2.4") < 0)
return NULL;
}
if (pend)
*pend = end;
return PyInt_FromLong(x);