2011-05-03 13 views
10

¿Alguien sabe por qué el par de códigos de bytes JSR/RET está en desuso en Java 6?¿Por qué JSR/RET está desaprobado del bytecode de Java?

La única explicación significativa que encontré en la red fue que hicieron el análisis de código por el tiempo de ejecución más difícil y más lento de realizar. ¿Alguien sabe otra razón?

+2

¿Quiere decir desaprobado por la JVM, o simplemente ya no lo usa el compilador de Java de Oracle? No pude encontrar un aviso de desaprobación en el JVMS 7 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.jsr –

Respuesta

10

JSR y RET hacen que la verificación de bytecode sea mucho más difícil de lo que podría ser debido a la relajación de algunas restricciones de bytecode normales (como tener una forma de pila consistente al ingresar a un JSR). El lado positivo es muy pequeño (métodos potencialmente un poco más pequeños en algunos casos) y las dificultades continuas en el verificador que lidia con patrones JSR/RET impares (y posibles vulnerabilidades de seguridad, y el costo de tiempo de ejecución asociado de verificación completa) lo convierten en una característica no útil para seguir teniendo.

Los mapas de pila y el verificador de peso liviano que se habilita como resultado de los datos son una gran ganancia de rendimiento durante la carga de clases sin sacrificar la seguridad.

+1

para el registro: las vulnerabilidades de seguridad no son solo potenciales, ha habido un error de verificador en una versión anterior de Java, donde usar el bytecode SWAP para intercambiar dos direcciones de retorno en la pila (vulnerabilidad JSR/JSR/SWAP/RET) causa confusión. – mihi

+0

¿Qué significa tener una forma de pila consistente en la entrada? – KodeWarrior

+0

La JVM usa una pila para representar operandos para operaciones. por ejemplo: el bytecode iadd espera 2 enteros en la pila, que aparece y luego empuja el resultado de sumarlos. Entonces, para ser una forma consistente significa que en cualquier posición de bytecode dada en el método, la pila siempre tiene la misma profundidad y cada elemento en la pila es del tipo correcto (es decir: int vs reference, etc.). –

Cuestiones relacionadas