[Python-checkins] r51715 - in python/branches/release24-maint: Misc/NEWS Objects/intobject.c

tim.peters python-checkins at python.org
Tue Sep 5 04:00:52 CEST 2006


Author: tim.peters
Date: Tue Sep  5 04:00:47 2006
New Revision: 51715

Modified:
   python/branches/release24-maint/Misc/NEWS
   python/branches/release24-maint/Objects/intobject.c
Log:
Merge rev 51711 from the 2.5 branch.

i_divmod():  As discussed on Python-Dev, changed the overflow
checking to live happily with recent gcc optimizations that
assume signed integer arithmetic never overflows.


Modified: python/branches/release24-maint/Misc/NEWS
==============================================================================
--- python/branches/release24-maint/Misc/NEWS	(original)
+++ python/branches/release24-maint/Misc/NEWS	Tue Sep  5 04:00:47 2006
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Overflow checking code in integer division ran afoul of new gcc
+  optimizations.  Changed to be more standard-conforming.
+
 - Patch #1541585: fix buffer overrun when performing repr() on
   a unicode string in a build with wide unicode (UCS-4) support.
 

Modified: python/branches/release24-maint/Objects/intobject.c
==============================================================================
--- python/branches/release24-maint/Objects/intobject.c	(original)
+++ python/branches/release24-maint/Objects/intobject.c	Tue Sep  5 04:00:47 2006
@@ -478,8 +478,14 @@
 				"integer division or modulo by zero");
 		return DIVMOD_ERROR;
 	}
-	/* (-sys.maxint-1)/-1 is the only overflow case. */
-	if (y == -1 && x < 0 && x == -x)
+	/* (-sys.maxint-1)/-1 is the only overflow case.  x is the most
+	 * negative long iff x < 0 and, on a 2's-complement box, x == -x.
+	 * However, -x is undefined (by C) if x /is/ the most negative long
+	 * (it's a signed overflow case), and some compilers care.  So we cast
+	 * x to unsigned long first.  However, then other compilers warn about
+	 * applying unary minus to an unsigned operand.  Hence the weird "0-".
+	 */
+	if (y == -1 && x < 0 && (unsigned long)x == 0-(unsigned long)x)
 		return DIVMOD_OVERFLOW;
 	xdivy = x / y;
 	xmody = x - xdivy * y;


More information about the Python-checkins mailing list