2012-05-12 2 views
18

누군가 프로그램의 정확성을 보장하기 위해 바이트 코드 검증 프로그램이 수행해야하는 주요 작업을 나열 할 수 있습니까? JVM 사양에 정의 된 표준, 최소한의 책임 집합이 있습니까? 또한 검증이 로딩 및 초기화와 같은 다른 단계에 걸쳐 수행되는지 궁금합니다.JVM 바이트 코드 검증 프로그램의 책임

답변

15

이것은 JVM Specification: Chapter 4.10. Verification of class Files에 지정됩니다.

페이지의 대부분은 유형 안전성의 다양한 측면을 설명합니다. 프로그램이 유형 안전하다는 것을 확인하기 위해 검증자는 각 프로그램 포인트에서 피연산자 스택에있는 피연산자 유형을 알아 내고 각각의 명령에 의해 예상되는 유형과 일치하는지 확인해야합니다. 그것은 포함 확인하지만, 다음에 한정되지 않고,

다른 것들 :

  • 가지 방법에 대한 코드 배열의 범위 내에 있어야합니다.

  • 모든 제어 흐름 명령어의 대상은 각각 명령어의 시작입니다. 넓은 명령어의 경우, 넓은 opcode가 명령어의 시작으로 간주되며, 해당 넓은 명령어로 수정 된 연산을 제공하는 opcode는 명령어를 시작하는 것으로 간주되지 않습니다. 명령의 중간으로의 분기는 허용되지 않습니다.

  • 명령어가 할당 한 로컬 변수의 수보다 크거나 같은 색인에서 로컬 변수에 액세스하거나 수정할 수있는 명령어가 없습니다.

  • 상수 풀에 대한 모든 참조는 해당 유형의 항목이어야합니다. 예를 들어 getfield 명령어는 필드를 참조해야합니다.

  • 코드가 명령어 중간에 끝나지 않습니다.

  • 코드 실행이 끝날 수 없습니다.

  • 각 예외 처리기에 대해 처리기로 보호되는 코드의 시작 및 끝 지점은 명령의 시작 부분에 있어야하며 종료 지점의 경우에는 코드 끝 부분을 지나야합니다. 시작점은 끝점 앞에 있어야합니다. 예외 처리기 코드는 유효한 명령어에서 시작해야하며 와이드 명령어로 수정되는 opcode에서 시작하면 안됩니다.

최종 단계로서 검증도 확인한다는 지시 참조하는 초기화 로컬 변수를 만드는 데이터 흐름 분석을 수행한다.

+0

로컬 파일 시스템에서 클래스를로드 할 때 Java 확인 프로그램을 사용할 수 있습니까? 예를 들어 Eclipse 또는 Apache가 클래스를로드 할 때 해당 바이트 코드가 검증 되었습니까? –

2

그것은은 다음을

  • 아무 피연산자 스택 오버 플로우가 없거나 모든 바이트 코드 명령어의 매개 변수의
  • 종류는 항상 올바른
  • 개체 필드 액세스는 것으로 알려져있다 언더 플로우 합법적 인 것으로 알려진 - 개인, public 또는 protected

참조 : http://java.sun.com/docs/white/langenv/Security.doc3.html

7

또는 James Gosling의 Java Language Environment 백서를보고 싶을 수도 있습니다.

enter image description here

바이트 코드 검증기는, 바이트 코드를 순회 형 상태 정보를 구성하고, 모든 바이트 코드 명령어에 파라미터의 종류를 확인한다.

그림은 인터프리터 런타임 시스템을 포함 Java 가상 머신에 클래스 로더와 바이트 코드 검증기 따라서에서의 Java 컴파일러를 통한 자바 언어 소스 코드로부터의 데이터 및 제어 흐름을 도시한다. 중요한 문제는 이며 Java 클래스 로더와 바이트 코드 확인 프로그램은 바이트 코드 스트림의 기본 소스에 대해 가정을하지 않습니다. 코드는 로컬 시스템에서 왔을 수도 있고중 절반을 지구를 돌아 다닐 수도 있습니다. 바이트 코드 검증기는 일종의 게이트 키퍼 역할을합니다 : 자바 인터프리터에 전달 된 코드가 적합 상태 인 에 있는지 확인하고 Java 인터프리터를 위반할 염려없이 실행할 수 있습니다. 가져온 코드는 검증 자의 테스트를 통과 할 때까지 어떤 수단으로도 실행될 수 없습니다 ( ). 검증이 이 완료되면, 중요한 속성의 숫자 알려져 있습니다

  • 더 피연산자 스택 오버 플로우가 없습니다 또는 모든 바이트 코드 명령어의 매개 변수의
  • 유형은 항상 올바른 것으로 알려진 언더 플로우
  • 개체 필드 액세스가 합법적 인 것으로 알려져있다 - 바이트 코드 검증이 작업을 수행 한 민간, 공공, 또는 시간 에 의해,

이 모든 검사가 극심한 자세한 나타납니다 동안 보호, 자바 INT 코드가 안전하게 실행된다는 사실을 알기 때문에 erpreter는 을 진행할 수 있습니다. 속성을 알고 있으면 은 아무것도 확인하지 않기 때문에 Java 인터프리터가 훨씬 빠릅니다. 피연산자 유형 검사가없고 스택에 오버 플로우 검사가 없습니다. 통역사는 신뢰성을 손상시키지 않으면 서 최대 속도 에서 작동 할 수 있습니다.