SORU
7 EYLÜL 2012, Cuma


Java: sıfır olmayan elemanları ile dizi başlatır int

Bu İDEA göre, int bir dizi sadece başlatma sonra sıfır ile doldurulmalıdır. Ancak, olmayan bir durumla karşı karşıyayım. Bu tür bir davranış ilk GÖRDÜM 7u4 görülür ve aynı zamanda tüm sonraki güncelleştirmeleri (64-bit uygulama kullanıyorum) oluşur. Aşağıdaki kodu özel durum atar:

public static void main(String[] args) {
        int[] a;
        int n = 0;
        for (int i = 0; i < 100000000;   i) {
            a = new int[10];
            for (int f : a)
                if (f != 0)
                  throw new RuntimeException("Array just after allocation: "  Arrays.toString(a));
            Arrays.fill(a, 0);
            for (int j = 0; j < a.length;   j)
                a[j] = (n - j)*i;
            for (int f : a)
                n  = f;
        }
        System.out.println(n);
    }

Özel JVM kod bloğunu derleme yapar ve -Xint bayrağı ile ortaya çıkmaz sonra oluşur. Ayrıca, Arrays.fill(...) deyimi (bu kod tüm diğer tablolar gibi) gereklidir, ve bu durum eğer devamsızlık oluşur değil. Bu olası hata bazı JVM optimizasyonu ile sınırlı olduğu açıktır. Böyle bir davranış, bu nedenle herhangi bir fikir?

Güncelleme:
Ben Fi tarihinde bu davranış, 64-bit server VM görmek, Gentoo Linux üzerinde 1.7.0_10 için 1.7.0_04 sürüm Java, Linux (çekirdek sürümü 3.0) Debian ve Aslan MacOS. Bu her zaman hata kodu ile yukarıda yeniden. 32-bit veya üzerinde olduğunu GÖRDÜM bir Windows ile bu sorunu test edemedim. Ben zaten Oracle için bir hata raporu gönderdi (hata kimliği 7196857) ve birkaç gün içinde kamu Oracle hata veritabanında görünecektir.

Güncelleme:
Oracle ortak hata kendi veritabanı bu hata yayınlandı: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857

CEVAP
11 EYLÜL 2012, Salı


Burada JİT-derleyici bir hata ile karşı karşıyayız. Derleyici tahsis dizi Arrays.fill(...), ayırma sonra dolu tahsis ve dolgu arasındaki kullanımlar için onay hatalı olduğunu belirler. Yani, derleyici yasadışı bir optimizasyon - atlar ayrılan dizinin sıfırlama gerçekleştirir.

Bu hata, Oracle hata takip (bug id 7196857) yerleştirilir. Ne yazık ki, şu noktaları hakkında Oracle tüm açıklamalar beklemiyordum. Olarak görüyorum, bu hata OS-özel: kesinlikle tekrarlanabilir 64-bit Linux ve Mac, ama, olarak görüyorum yorumlarını, çoğalır düzenli Windows (benzer sürümleri ile İLGİLENİYORUZ). Ayrıca bu hata düzeltildi ne zaman olacağını bilmek güzel olurdu.

Şu anda tavsiye sadece: JDK1 kullanmayın.7.Eğer yeni ilan diziler için İDEA bağlıdır 0_04 ya da geç.

Ekim 5 güncelleme:

Bu FIRSATLAR 7u10 (erken erişim) Ekim de tahliye Build 10 yeni 04, 2012, bu hata, en azından Linux OS (diğer test etmedim) giderilmiştir. Teşekkürler @bu hata artık hata Oracle veritabanında kamu erişim için kullanılabilir bulan Makoto,. Ne yazık ki, Oracle ortak erişim kaldırılmasını nedenlerden dolayı bilmiyorum, ama cache Google mevcuttur. Ayrıca, bu hata Redhat dikkatini çekti: 'A CVE-2012-4420 (bugzilla) ve CVE-2012-4416 (bugzilla) Bu kusur ayrıldı tanımlayıcıları.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • sWooZie

    sWooZie

    9 ŞUBAT 2006
  • TheRightTire

    TheRightTire

    14 EKİM 2009