This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Bug(s) inside IdentityHashMap.java
- To: java at gcc dot gnu dot org
- Subject: Bug(s) inside IdentityHashMap.java
- From: Martin Kahlert <martin dot kahlert at infineon dot com>
- Date: Thu, 27 Sep 2001 16:16:47 +0200
- Reply-To: martin dot kahlert at infineon dot com
Hi!
I have some problems with IdentityHashMap.java:
First: Where is table.length set?
Then:
The file contains a lot of copies of the term
h = Math.abs (2 * System.identityHashCode (key) % table.length);
this is the same as
h = Math.abs ((2 * System.identityHashCode (key)) % table.length);
thus, h may be table.length - 1;
but in get() we ask for return table[h + 1];
which is an memory violation.
Furthermore, as i understand the code, h should be even, which it is not
(table[h] should be a key).
So i replaced all (x*y%z) by (x*(y%z)) which is more like i understand that,
but i continue to get segfaults, this times inside get:
(h = 1078781084) which seems a bit large ;-) perhaps table.length overflowed
integer? Tomorrow i will look into that.
Strange.
Here is the patch anyway:
2001-09-27 Martin Kahlert <martin.kahlert@infineon.com>
* java/util/IdentityHashMap.java(containsKey): Fix operator precedence bug
(get): Likewise
(put): Likewise
(remove): Likewise
*** IdentityHashMap.java.old Thu Sep 27 15:55:55 2001
--- IdentityHashMap.java Thu Sep 27 15:55:28 2001
***************
*** 103,109 ****
public boolean containsKey (Object key)
{
! int h = Math.abs (2 * System.identityHashCode (key) % table.length);
int save = h;
while (true)
{
--- 103,109 ----
public boolean containsKey (Object key)
{
! int h = Math.abs (2 * (System.identityHashCode (key) % table.length));
int save = h;
while (true)
{
***************
*** 174,180 ****
public Object get (Object key)
{
! int h = Math.abs (2 * System.identityHashCode (key) % table.length);
int save = h;
while (true)
{
--- 174,180 ----
public Object get (Object key)
{
! int h = Math.abs (2 * (System.identityHashCode (key) % table.length));
int save = h;
while (true)
{
***************
*** 230,236 ****
public Object put (Object key, Object value)
{
! // Rehash is the load factor is too high.
if (size * 3 / 2 > table.length)
{
Object[] old = table;
--- 230,236 ----
public Object put (Object key, Object value)
{
! // Rehash if the load factor is too high.
if (size * 3 / 2 > table.length)
{
Object[] old = table;
***************
*** 248,254 ****
}
}
! int h = Math.abs (2 * System.identityHashCode (key) % table.length);
int save = h;
int del = -1;
while (true)
--- 248,254 ----
}
}
! int h = Math.abs (2 * (System.identityHashCode (key) % table.length));
int save = h;
int del = -1;
while (true)
***************
*** 288,294 ****
public Object remove (Object key)
{
! int h = Math.abs (2 * System.identityHashCode (key) % table.length);
int save = h;
while (true)
{
--- 288,294 ----
public Object remove (Object key)
{
! int h = Math.abs (2 * (System.identityHashCode (key) % table.length));
int save = h;
while (true)
{
--
The early bird catches the worm. If you want something else for
breakfast, get up later.