2016-07-25 6 views
8

Der folgende CodeWarum ist es, dass der Code unten anders in Java verhält 1.6 und 1.7

public class Test16Jit { 
    public static void main(String[] s) { 
     int max = Integer.MAX_VALUE; 
     int i = 0; 
     long li = 0; 
     while (i >= 0) { 
      i++; 
      li++; 
      if (i > max) { 
       System.out.println("i is : " + i); 
       System.out.println("max is : " + max); 
       System.out.println("Woo!! something really went wrong"); 
      } 
     } 
     System.out.println("Value of i: " + i); 
     System.out.println("Total # of iterations: " + li);  
    } 
} 

Ausgänge unten in Java 1.7x

Value of i: -2147483648 
Total # of iterations: 2147483648 

Ausgänge unten in Java 1.6x

i is : 2147483636 
max is : 2147483647 
Woo!! something really went wrong 
Value of i: -2147483648 
Total # of iterations: 2147483648 

Gibt es einen Grund für dieses Verhalten?

Auch wenn ich ändere

int max = Integer.MAX_VALUE; -> final int max = Integer.MAX_VALUE; 

Es in 1.6x genau gleiche verhält und 1.7x

+1

Erhalten Sie einen Unterschied im Verhalten vom einfacheren Code 'int max = Integer.MAX_VALUE; int i = 2147483636; System.out.println (i> max); '? –

+1

@AndyTurner Ich habe nicht getestet, aber ich vermute, das soll ein JIT-Bug sein. – shmosel

+0

Das druckt falsch @AndyTurner –

Antwort

7

Es scheint, als eines von vielen Beispielen für eine Familie von Fehlern zu diesem durch die JIT-Kompilierung verursacht werden (ich nahm diese eine aufgrund Ähnlichkeit der Code, fühlen sie sich frei, andere zu erforschen - sie recht interessant sind!):

http://bugs.java.com/view_bug.do?bug_id=6196102

BEWERTUNG

Problem ist mit canonicalization der Schleife Ausgangstest in Vorbereitung für Loop-Transformation.

do while (++i <= limit)

wird

do while (++i < limit+1)

Dies ist nicht korrekt, wenn Limit MAXINT ist.

Einige Probleme wurden in 1.7 behoben, die Ihre Ergebnisse erklären könnten.

+1

Sehr gut finden. Allerdings kratze ich immer noch ein bisschen am Kopf, warum würde das am Ende passieren, wenn Integer Overflow? –

Verwandte Themen