diff options
author | Gregory P. Smith <greg@krypto.org> | 2012-12-11 02:32:53 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@krypto.org> | 2012-12-11 02:32:53 (GMT) |
commit | c2176e46d797c8aea60cdcd2ddf44f6bb88394b4 (patch) | |
tree | 5c4d898d216d25af779db557da42e1fccbb31e6d /Objects/tupleobject.c | |
parent | c0dd80e439bff4bd7cd9acc34ae023b4e8adf4aa (diff) | |
parent | 27cbcd6241d787b5e99c6ed05ec8377051f397aa (diff) | |
download | cpython-c2176e46d797c8aea60cdcd2ddf44f6bb88394b4.zip cpython-c2176e46d797c8aea60cdcd2ddf44f6bb88394b4.tar.gz cpython-c2176e46d797c8aea60cdcd2ddf44f6bb88394b4.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.
NOTE: This change is smaller compared to 3.2 as much of this cleanup had
already been done. I added the comment that my change in 3.2 added so that the
code would match up. Otherwise this just adds or synchronizes appropriate UL
designations on some constants to be pedantic.
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.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 9c843fa..ec3f91b 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -327,12 +327,12 @@ error: static Py_hash_t tuplehash(PyTupleObject *v) { - register Py_uhash_t x; + register Py_uhash_t x; /* Unsigned for defined overflow behavior. */ register Py_hash_t y; register Py_ssize_t len = Py_SIZE(v); register PyObject **p; Py_uhash_t mult = _PyHASH_MULTIPLIER; - x = 0x345678; + x = 0x345678UL; p = v->ob_item; while (--len >= 0) { y = PyObject_Hash(*p++); @@ -340,9 +340,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_hash_t)(82520UL + len + len); } - x += 97531L; + x += 97531UL; if (x == (Py_uhash_t)-1) x = -2; return x; |