diff options
author | Gregory P. Smith <greg@krypto.org> | 2012-12-11 02:15:46 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@krypto.org> | 2012-12-11 02:15:46 (GMT) |
commit | 27cbcd6241d787b5e99c6ed05ec8377051f397aa (patch) | |
tree | 02fe4460f5a52993a36a9aa575397f9001700ae1 /Objects | |
parent | 90555d0f0d0b8e4ffbbb37ba12a8e43020ad1e98 (diff) | |
download | cpython-27cbcd6241d787b5e99c6ed05ec8377051f397aa.zip cpython-27cbcd6241d787b5e99c6ed05ec8377051f397aa.tar.gz cpython-27cbcd6241d787b5e99c6ed05ec8377051f397aa.tar.bz2 |
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')
-rw-r--r-- | Objects/bytesobject.c | 2 | ||||
-rw-r--r-- | Objects/setobject.c | 12 | ||||
-rw-r--r-- | Objects/tupleobject.c | 10 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 2 |
4 files changed, 13 insertions, 13 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 796e400..ef3a5a1 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -873,7 +873,7 @@ bytes_hash(PyBytesObject *a) { register Py_ssize_t len; register unsigned char *p; - register Py_hash_t x; + register Py_uhash_t x; /* Unsigned for defined overflow behavior. */ #ifdef Py_DEBUG assert(_Py_HashSecret_Initialized); diff --git a/Objects/setobject.c b/Objects/setobject.c index 3abeefb..d8401f4 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -77,7 +77,7 @@ NULL if the rich comparison returns an error. static setentry * set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash) { - register Py_ssize_t i; + register size_t i; /* Unsigned for defined overflow behavior. */ register size_t perturb; register setentry *freeslot; register size_t mask = so->mask; @@ -159,7 +159,7 @@ set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash) static setentry * set_lookkey_unicode(PySetObject *so, PyObject *key, register Py_hash_t hash) { - register Py_ssize_t i; + register size_t i; /* Unsigned for defined overflow behavior. */ register size_t perturb; register setentry *freeslot; register size_t mask = so->mask; @@ -768,7 +768,7 @@ static Py_hash_t frozenset_hash(PyObject *self) { PySetObject *so = (PySetObject *)self; - Py_hash_t h, hash = 1927868237L; + Py_uhash_t h, hash = 1927868237UL; setentry *entry; Py_ssize_t pos = 0; @@ -783,11 +783,11 @@ frozenset_hash(PyObject *self) hashes so that many distinct combinations collapse to only a handful of distinct hash values. */ h = entry->hash; - hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u; + hash ^= (h ^ (h << 16) ^ 89869747UL) * 3644798167UL; } - hash = hash * 69069L + 907133923L; + hash = hash * 69069UL + 907133923UL; if (hash == -1) - hash = 590923713L; + hash = 590923713UL; so->hash = hash; return hash; } diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index b345460..c725227 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; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 565d298..bb45b20 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7686,7 +7686,7 @@ unicode_hash(PyUnicodeObject *self) { Py_ssize_t len; Py_UNICODE *p; - Py_hash_t x; + Py_uhash_t x; /* Unsigned for defined overflow behavior. */ #ifdef Py_DEBUG assert(_Py_HashSecret_Initialized); |