# HG changeset patch # Parent 89821243621b2ebf7aa38143e813c2cc76739fff Issue #1621: Abort on integer overflows with GCC; avoid some trivial overflows diff -r 89821243621b Modules/_elementtree.c --- a/Modules/_elementtree.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Modules/_elementtree.c Fri Jul 15 02:52:10 2016 +0000 @@ -1725,11 +1725,13 @@ if (!list) return NULL; - for (cur = start, i = 0; i < slicelen; - cur += step, i++) { + for (cur = start, i = 0; i < slicelen; i++) { PyObject* item = self->extra->children[cur]; Py_INCREF(item); PyList_SET_ITEM(list, i, item); + if (i + 1 < slicelen) { + cur += step; + } } return list; @@ -1880,9 +1882,12 @@ Py_DECREF(seq); return -1; } - for (cur = start, i = 0; i < slicelen; - cur += step, i++) + for (cur = start, i = 0; i < slicelen; i++) { PyList_SET_ITEM(recycle, i, self->extra->children[cur]); + if (i + 1 < slicelen) { + cur += step; + } + } } if (newlen < slicelen) { @@ -1896,11 +1901,13 @@ } /* replace the slice */ - for (cur = start, i = 0; i < newlen; - cur += step, i++) { + for (cur = start, i = 0; i < newlen; i++) { PyObject* element = PySequence_Fast_GET_ITEM(seq, i); Py_INCREF(element); self->extra->children[cur] = element; + if (i + 1 < newlen) { + cur += step; + } } self->extra->length += newlen - slicelen; diff -r 89821243621b Modules/audioop.c --- a/Modules/audioop.c Thu Jul 14 07:45:24 2016 +0300 +++ b/Modules/audioop.c Fri Jul 15 02:52:10 2016 +0000 @@ -446,7 +446,9 @@ return NULL; for (i = 0; i < fragment->len; i += width) { int val = GETRAWSAMPLE(width, fragment->buf, i); - if (val < 0) absval = (-val); + /* Cast to unsigned before negating. Unsigned overflow is well- + defined, but signed overflow is not. */ + if (val < 0) absval = -(unsigned int)val; else absval = val; if (absval > max) max = absval; } diff -r 89821243621b configure --- a/configure Thu Jul 14 07:45:24 2016 +0300 +++ b/configure Fri Jul 15 02:52:10 2016 +0000 @@ -6763,7 +6763,7 @@ if test "$CC" != 'g++' ; then STRICT_PROTO="-Wstrict-prototypes" fi - # For gcc 4.x we need to use -fwrapv so lets check if its supported + # For GCC >= 4.x we need to use -fwrapv, so check if it's supported if "$CC" -v --help 2>/dev/null |grep -- -fwrapv > /dev/null; then WRAP="-fwrapv" fi @@ -6779,8 +6779,12 @@ if test "$Py_DEBUG" = 'true' ; then # Optimization messes up debuggers, so turn it off for # debug builds. + if "$CC" -v --help 2>/dev/null |grep -- -ftrapv > /dev/null + then + TRAPV="-ftrapv" + fi if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall $STRICT_PROTO" + OPT="-g $TRAPV -Og -Wall $STRICT_PROTO" else OPT="-g -O0 -Wall $STRICT_PROTO" fi diff -r 89821243621b configure.ac --- a/configure.ac Thu Jul 14 07:45:24 2016 +0300 +++ b/configure.ac Fri Jul 15 02:52:10 2016 +0000 @@ -1367,7 +1367,7 @@ if test "$CC" != 'g++' ; then STRICT_PROTO="-Wstrict-prototypes" fi - # For gcc 4.x we need to use -fwrapv so lets check if its supported + # For GCC >= 4.x we need to use -fwrapv, so check if it's supported if "$CC" -v --help 2>/dev/null |grep -- -fwrapv > /dev/null; then WRAP="-fwrapv" fi @@ -1383,8 +1383,12 @@ if test "$Py_DEBUG" = 'true' ; then # Optimization messes up debuggers, so turn it off for # debug builds. + if "$CC" -v --help 2>/dev/null |grep -- -ftrapv > /dev/null + then + TRAPV="-ftrapv" + fi if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall $STRICT_PROTO" + OPT="-g $TRAPV -Og -Wall $STRICT_PROTO" else OPT="-g -O0 -Wall $STRICT_PROTO" fi