ralekseenkov's blog

By ralekseenkov, 14 years ago, In Russian
Нечасто мне в последнее время приходится писать код. Думал в это воскресенье быстренько напишу за часок нужную мне вещь, но не тут то было. Все написал, все отлично, но иногда программа падала на разных ассертах и непонятно из-за чего. А вроде все детерминированно - в яве проблем с неициализированной памятью нет, никаких коллекций с негарантированным порядком обхода я не использовал... в основном использовались только циклы и массивы.

В итоге убил пол дня на дебаг нестабильной программы, и оказалось баг в JVM! Если в функцию передаешь Integer.MAX_VALUE и пытаешься его использовать справа в сравнении на меньше или равно, в цикле, иногда возвращается false.

Вот минимальный код на котором происходит проблема.
 1 public class Test {
2
3 public static void main(String[] args) {
4 for (int i = 0; ; i++) {
5 try {
6 go(Integer.MAX_VALUE);
7 } catch (Exception e) {
8 System.err.println("Failed after " + i + " iterations");
9 throw new IllegalStateException(e.getMessage());
10 }
11 }
12 }
13
14 private static void go(int maxSteps) {
15 int count = 1;
16 while (count <= maxSteps) {
17 if (count >= 10) {
18 break;
19 }
20 count++;
21 }
22
23 if (count != 10) {
24 throw new IllegalStateException("Count = " + count);
25 }
26
27 }
28
29 }

Выводит примерно следующее:
  Failed after 2402 iterations
Exception in thread "main" java.lang.IllegalStateException: Count = 2
at Test.main(Test.java:9)

Java:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

Был бы благодарен, если бы кто-нибудь потестил под разными системами - винда, линукс и отписался о результатах указывая OS и Java version.

UPD: спасибо всем откликнувшимся. видимо проблема в 64-битной JVM, проявляется на всех платформах. баг репорт отправлен в оракл, проходит скрининг http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7007863.
  • Vote: I like it
  • +28
  • Vote: I do not like it