summaryrefslogtreecommitdiff
path: root/Objects/tupleobject.c
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2012-12-10 18:15:46 -0800
committerGregory P. Smith <greg@krypto.org>2012-12-10 18:15:46 -0800
commit27cbcd6241d787b5e99c6ed05ec8377051f397aa (patch)
tree02fe4460f5a52993a36a9aa575397f9001700ae1 /Objects/tupleobject.c
parent90555d0f0d0b8e4ffbbb37ba12a8e43020ad1e98 (diff)
downloadcpython-git-27cbcd6241d787b5e99c6ed05ec8377051f397aa.tar.gz
Fix the internals of our hash functions to used unsigned values during hash
computation as the overflow behavior of signed integers is undefined. In practice we require compiling everything with -fwrapv which forces overflow to be defined as twos compliment but this keeps the code cleaner for checkers or in the case where someone has compiled it without -fwrapv or their compiler's equivalent. Found by Clang trunk's Undefined Behavior Sanitizer (UBSan). Cleanup only - no functionality or hash values change.
Diffstat (limited to 'Objects/tupleobject.c')
-rw-r--r--Objects/tupleobject.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index b3454600c9..c725227979 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -315,11 +315,11 @@ error:
static Py_hash_t
tuplehash(PyTupleObject *v)
{
- register Py_hash_t x, y;
+ register Py_uhash_t x, y; /* Unsigned for defined overflow behavior. */
register Py_ssize_t len = Py_SIZE(v);
register PyObject **p;
- Py_hash_t mult = _PyHASH_MULTIPLIER;
- x = 0x345678L;
+ Py_uhash_t mult = _PyHASH_MULTIPLIER;
+ x = 0x345678UL;
p = v->ob_item;
while (--len >= 0) {
y = PyObject_Hash(*p++);
@@ -327,9 +327,9 @@ tuplehash(PyTupleObject *v)
return -1;
x = (x ^ y) * mult;
/* the cast might truncate len; that doesn't change hash stability */
- mult += (Py_hash_t)(82520L + len + len);
+ mult += (Py_uhash_t)(82520UL + len + len);
}
- x += 97531L;
+ x += 97531UL;
if (x == -1)
x = -2;
return x;