Avoid signed integer overflow in identity hash code.
Caught by -ftrapv.
Change-Id: Ib8dbb31440ccce88a3c3ce7ea3b2394621616eff
diff --git a/runtime/mirror/object.cc b/runtime/mirror/object.cc
index 9578c97..4227723 100644
--- a/runtime/mirror/object.cc
+++ b/runtime/mirror/object.cc
@@ -135,11 +135,11 @@
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<uint32_t> seed(987654321U + std::time(nullptr));
+ uint32_t expected_value, new_value;
do {
- expected_value = static_cast<uint32_t>(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 b2b2420..0ce5231 100644
--- a/runtime/mirror/object.h
+++ b/runtime/mirror/object.h
@@ -451,7 +451,7 @@
}
// 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