From bbcd30bf9a39e40879426ec703985c96df1d7491 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Thu, 30 Oct 2014 15:25:36 -0700 Subject: [PATCH] Avoid signed integer overflow in identity hash code. Caught by -ftrapv. Change-Id: Ib8dbb31440ccce88a3c3ce7ea3b2394621616eff --- runtime/mirror/object.cc | 8 ++++---- runtime/mirror/object.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/runtime/mirror/object.cc b/runtime/mirror/object.cc index 9578c97d8..42277238a 100644 --- a/runtime/mirror/object.cc +++ b/runtime/mirror/object.cc @@ -135,11 +135,11 @@ Object* Object::Clone(Thread* self) { return copy; } -int32_t Object::GenerateIdentityHashCode() { - static AtomicInteger seed(987654321 + std::time(nullptr)); - int32_t expected_value, new_value; +uint32_t Object::GenerateIdentityHashCode() { + static Atomic seed(987654321U + std::time(nullptr)); + uint32_t expected_value, new_value; do { - expected_value = static_cast(seed.LoadRelaxed()); + expected_value = seed.LoadRelaxed(); new_value = expected_value * 1103515245 + 12345; } while ((expected_value & LockWord::kHashMask) == 0 || !seed.CompareExchangeWeakRelaxed(expected_value, new_value)); diff --git a/runtime/mirror/object.h b/runtime/mirror/object.h index b2b24209c..0ce5231b4 100644 --- a/runtime/mirror/object.h +++ b/runtime/mirror/object.h @@ -451,7 +451,7 @@ class MANAGED LOCKABLE Object { } // Generate an identity hash code. - static int32_t GenerateIdentityHashCode(); + static uint32_t GenerateIdentityHashCode(); // A utility function that copies an object in a read barrier and // write barrier-aware way. This is internally used by Clone() and -- 2.11.0