JDK-6985295 : JVM fails to evaluate condition randomly
  • Type: Bug
  • Component: hotspot
  • Sub-Component: compiler
  • Affected Version: 6u21
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux_ubuntu
  • CPU: x86
  • Submitted: 2010-09-16
  • Updated: 2012-03-20
  • Resolved: 2010-12-28
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
[karel@myhost src]$ java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) Server VM (build 17.0-b16, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Linux myhost 2.6.32-24-generic-pae #42-Ubuntu SMP Fri Aug 20 15:37:22 UTC 2010 i686 GNU/Linux


EXTRA RELEVANT SYSTEM CONFIGURATION :
not important

A DESCRIPTION OF THE PROBLEM :
Following iteration is terminated randomly (the terminate condition should be never met, the iteration should run indefinitely):

public class MaxIntConditionDefect {

    public static void main(String[] args) {
        int min = 1;
        int max = Integer.MAX_VALUE;
        System.out.println("max = " + max);
        long counter = 0;
        int i;
        for(i = min; i <= max; i++) {
            counter++;
            System.out.println("asking for");
        }
        System.out.println("iteration went " + counter + " times (" + i + ")");
        System.out.println("max = " + max);
    }

}


STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
compile and run the above code

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
I expect the cycle to run indefinitely (just sample...)
ACTUAL -
one sample:
max = 2147483647
asking for
asking for
.....
asking for
asking for
iteration went 14563 times (14564)
max = 2147483647

another sample:
max = 2147483647
asking for
asking for
.....
asking for
asking for
iteration went 15587 times (15588)
max = 2147483647


ERROR MESSAGES/STACK TRACES THAT OCCUR :
no explicit error, just unexpected behavior

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
public class MaxIntConditionDefect {

    public static void main(String[] args) {
        int min = 1;
        int max = Integer.MAX_VALUE;
        System.out.println("max = " + max);
        long counter = 0;
        int i;
        for(i = min; i <= max; i++) {
            counter++;
            System.out.println("asking for");
        }
        System.out.println("iteration went " + counter + " times (" + i + ")");
        System.out.println("max = " + max);
    }

}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
I have found a workaround in my case - compare to Integer.MAX_VALUE-1 - in my case it does not matter whether I compare to Integer.MAX_VALUE or Integer.MAX_VALUE-1