2011-05-03 28 views
10

JSR/RET bayt kodu çiftinin neden Java 6'da kullanımdan kaldırıldığını bilen var mı?JSR/RET neden Java bayt kodunu reddetti?

Ağda bulduğum tek anlamlı açıklama, çalışma zamanına göre kod analizini yapması ve daha yavaş gerçekleştirmesiydi. Başka bir neden bilen var mı?

+2

JVM tarafından kullanımdan kaldırılmış mı, yoksa artık Oracle'ın Java derleyicisi tarafından artık kullanılmıyor mu? JVMS 7'de kullanım dışı bırakma bildirimi bulamadım https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.jsr –

cevap

10

JSR ve RET, normal baytkod kısıtlamalarının (JSR'ye girişte tutarlı bir yığın şekline sahip olması gibi) gevşemesinden ötürü, bytecode doğrulama işlemini çok daha zor hale getirir. Üst kısım çok küçüktür (bazı durumlarda potansiyel olarak biraz daha küçük yöntemler) ve tekil JSR/RET kalıpları (ve olası güvenlik açıkları ve tam doğrulamanın ilişkili çalışma zamanı maliyeti) ile ilgili doğrulayıcıda devam eden zorluklar, onu yararlı olmayan bir özellik haline getirir devam etmek.

Verilerin sonucunda etkinleştirilen yığın haritaları ve daha hafif veri doğrulayıcı, güvenlik açısından hiçbir fedakarlık sağlamadan sınıf yükleme sırasında büyük bir performans kazancıdır.

+1

: güvenlik açıkları yalnızca potansiyel değildir, daha eski bir Java sürümünde, SWAP bayt kodunun yığın üzerindeki iki döndürme adresini (JSR/JSR/SWAP/RET güvenlik açığı) değiştirmek için kullanılmasının tür karmaşasına yol açtığı doğrulanmış bir hata oluştu. – mihi

+0

Girişte tutarlı bir yığın şekli nedir? – KodeWarrior

+0

JVM, işlemler için işlenenleri temsil etmek için bir yığın kullanır. örneğin: iadd bayt kodu, yığında bulunan 2 tam sayıyı bekler ve ardından bunları bir araya getirme sonucunu iter. Bu nedenle tutarlı bir şekil olması, yöntemdeki herhangi bir bytecode konumunda, yığının her zaman aynı derinlik ve yığındaki her elemanın doğru tipte olduğu anlamına gelir (örn: int vs reference, vs ..). –

İlgili konular