2011-05-03 2 views
10

JSR/RET 바이트 코드 쌍이 Java 6에서 사용되지 않는 이유는 누구입니까?왜 JSR/RET가 더 이상 사용되지 않는 Java 바이트 코드입니까?

내가 그물에서 발견 한 유일한 의미있는 설명은 런타임에 의한 코드 분석을 수행하고 느리게 수행한다는 것이 었습니다. 다른 사람이 다른 이유를 알고 있습니까?

+2

JVM에서 더 이상 사용되지 않거나 오라클의 Java 컴파일러에서 단순히 더 이상 사용하지 않습니까? JVMS 7에서 비추천 통지를 찾을 수 없습니다. https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.jsr –

+3

@CiroSantilli 巴拿馬 文件 六 四 事件법륜 효과 : 검색을 많이 한 후에 Java 7 클래스 (클래스 파일 형식 51.0)에서이 지침에 대한 규칙을 발견했습니다. JVMS의 [§4.9.1] (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.1)에 있습니다. 자세한 내용은 [내 Q & A on this] (http://stackoverflow.com/q/37013761/1468366)을 참조하십시오. – MvG

답변

10

JSR 및 RET은 바이트 코드 확인을 JSR에 대한 입력시 일관된 스택 모양을 갖는 것과 같은 일부 정상적인 바이트 코드 제약 조건 완화로 인해 훨씬 ​​더 어렵게 만듭니다. 위쪽은 매우 미미하며 (경우에 따라 약간 더 작은 메소드 일 수도 있음), 이상한 JSR/RET 패턴 (잠재적 보안 취약성 및 전체 검증의 런타임 관련 비용)을 처리하는 검증자가 계속 어려움을 겪으면 유용하지 않은 기능이됩니다 계속하기.

스택 맵과 데이터의 결과로 사용되는 더 가벼운 검증기는 클래스 로딩 중에 안전상의 희생없이 큰 성능을 얻습니다.

+1

: 보안 취약점은 잠재적 인 것만이 아니라 오래된 Java 버전에 검증 자 버그가있어 스택에서 두 개의 반환 주소 (JSR/JSR/SWAP/RET 취약점)를 교환하기 위해 SWAP 바이트 코드를 사용하면 유형 혼동이 발생합니다. – mihi

+0

진입시 일관된 스택 모양을 갖는 것은 무엇을 의미합니까? – KodeWarrior

+0

JVM은 스택을 사용하여 작업에 대한 피연산자를 나타냅니다. 예를 들면 : iadd 바이트 코드는 스택에 2 개의 정수를 기대하고, 그 결과를 합친 결과를 밀어 낸다. 일관된 모양을 가지려면 메소드의 모든 바이트 코드 위치에서 스택이 항상 동일한 깊이이고 스택의 각 요소가 올바른 유형 (예 : int 대 참조 등)이어야합니다. –

관련 문제