[collections] about a possible issue with AbstractLinkedList.hashCode()

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[collections] about a possible issue with AbstractLinkedList.hashCode()

Facundo Molina
Dear all,

My name is Facundo, and I'm currently working on automated test generation.
As part of an experiment, I came across a potential issue
with org.apache.commons.collections4.list.AbstractLinkedList.hashCode. The
code of this method is:

  @Override

  public int hashCode() {

    int hashCode = 1;

    for (final E e : this) {

      hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());

    }

    return hashCode;

  }


The problem may arise when generating a collection of Object, and inserting
the same collection as an element of itself. For example, consider the
following test case using the class NodeCachingLinkedList which extends
AbstractLinkedList:

  @Test

  public void test0() {

    NodeCachingLinkedList<Object> nodeCachingLinkedListGA0 = new
NodeCachingLinkedList<Object>();

    nodeCachingLinkedListGA0.addFirst(nodeCachingLinkedListGA0);

    nodeCachingLinkedListGA0.hashCode();

  }


This will result in an infinite recursive call, leading to a stack overflow
exception.

I would like to know if you consider this to be an issue. A possible
solution would be the following:

  @Override

  public int hashCode() {

    int hashCode = 1;

    for (final E e : this) {

      hashCode = 31 * hashCode + (e == null || e == this ? 0 : e
.hashCode());

    }

    return hashCode;

  }


Please let me know what you think about it.

Best regards,
Facundo

--
Facundo Molina
Reply | Threaded
Open this post in threaded view
|

RE: [collections] about a possible issue with AbstractLinkedList.hashCode()

Ray Sprinkle
This would only partially solve the problem.  In general a circular reference, in any object, will demonstrate the same problem.
 
-----Original Message-----
From: Facundo Molina <[hidden email]>
Sent: Wednesday, December 4, 2019 8:19 AM
To: [hidden email]
Subject: [collections] about a possible issue with AbstractLinkedList.hashCode()

Dear all,

My name is Facundo, and I'm currently working on automated test generation.
As part of an experiment, I came across a potential issue with org.apache.commons.collections4.list.AbstractLinkedList.hashCode. The code of this method is:

  @Override

  public int hashCode() {

    int hashCode = 1;

    for (final E e : this) {

      hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());

    }

    return hashCode;

  }


The problem may arise when generating a collection of Object, and inserting the same collection as an element of itself. For example, consider the following test case using the class NodeCachingLinkedList which extends
AbstractLinkedList:

  @Test

  public void test0() {

    NodeCachingLinkedList<Object> nodeCachingLinkedListGA0 = new NodeCachingLinkedList<Object>();

    nodeCachingLinkedListGA0.addFirst(nodeCachingLinkedListGA0);

    nodeCachingLinkedListGA0.hashCode();

  }


This will result in an infinite recursive call, leading to a stack overflow exception.

I would like to know if you consider this to be an issue. A possible solution would be the following:

  @Override

  public int hashCode() {

    int hashCode = 1;

    for (final E e : this) {

      hashCode = 31 * hashCode + (e == null || e == this ? 0 : e .hashCode());

    }

    return hashCode;

  }


Please let me know what you think about it.

Best regards,
Facundo

--
Facundo Molina

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]