2012-05-12 35 views
18

Ai đó có thể liệt kê các nhiệm vụ chính mà bộ xác minh bytecode phải thực hiện để đảm bảo tính chính xác của chương trình? Có một tập hợp tiêu chuẩn, tối thiểu các trách nhiệm được định nghĩa trong đặc tả JVM không? Tôi cũng tự hỏi liệu việc xác minh có kéo dài qua các giai đoạn khác như tải và khởi tạo hay không.Trách nhiệm của JVM bytecode verifier

Trả lời

15

Điều này được chỉ định trong JVM Specification: Chapter 4.10. Verification of class Files.

Phần lớn trang mô tả các khía cạnh khác nhau của an toàn loại. Để kiểm tra xem chương trình có an toàn hay không, trình xác minh cần tìm ra loại toán hạng nào nằm trong chồng toán hạng tại mỗi điểm chương trình và đảm bảo rằng chúng khớp với kiểu được mong đợi bằng lệnh tương ứng.

Những thứ khác nó xác minh bao gồm, nhưng không giới hạn như sau:

  • Chi nhánh phải nằm trong giới hạn của mảng mã cho phương pháp này.

  • Các mục tiêu của tất cả các hướng dẫn dòng điều khiển là mỗi lần bắt đầu một lệnh. Trong trường hợp một lệnh rộng, opcode rộng được coi là bắt đầu của lệnh và opcode cho phép hoạt động được sửa đổi bởi lệnh rộng đó không được xem là bắt đầu một lệnh. Các chi nhánh ở giữa lệnh không được phép.

  • Không có hướng dẫn nào có thể truy cập hoặc sửa đổi biến cục bộ tại chỉ mục lớn hơn hoặc bằng số biến cục bộ mà phương thức của nó cho biết phân bổ.

  • Tất cả các tham chiếu đến nhóm không đổi phải là mục nhập của loại thích hợp. (Ví dụ: trường dẫn hướng phải tham chiếu một trường.)

  • Mã không kết thúc ở giữa lệnh.

  • Thực thi không thể rơi vào cuối mã.

  • Đối với mỗi trình xử lý ngoại lệ, điểm bắt đầu và điểm kết thúc của mã được trình xử lý bảo vệ phải ở đầu hướng dẫn hoặc trong trường hợp điểm kết thúc, ngay lập tức qua cuối mã. Điểm bắt đầu phải trước điểm kết thúc. Mã xử lý ngoại lệ phải bắt đầu bằng một lệnh hợp lệ và nó không được bắt đầu bằng một mã opcode đang được sửa đổi bởi lệnh rộng.

Là một bước cuối cùng người xác minh cũng tiến hành phân tích dữ liệu dòng chảy, mà làm cho chắc chắn rằng không có tài liệu tham khảo hướng dẫn bất kỳ biến địa phương chưa được khởi tạo.

+0

Trình xác minh Java có được bật khi tải các lớp học từ hệ thống tệp cục bộ không? Ví dụ khi Eclipse hoặc Apache tải một lớp, có phải bytecode đã được xác minh không? –

2

Nó làm như sau:

  • Không có toán hạng stack tràn hoặc underflows
  • Các loại các thông số của tất cả các hướng dẫn bytecode được biết là luôn đúng
  • truy lĩnh vực đối tượng là được gọi là hợp pháp - riêng tư, công khai hoặc được bảo vệ

Tham chiếu: http://java.sun.com/docs/white/langenv/Security.doc3.html

7

Hoặc bạn có thể muốn xem qua giấy trắng Java Language Environment của James Gosling.

enter image description here

Các xác minh bytecode đi qua bytecode, xây dựng các thông tin trạng thái loại , và xác minh các loại của các thông số cho tất cả các hướng dẫn bytecode.

Hình minh họa cho thấy dòng chảy của dữ liệu và điều khiển từ mã nguồn Java ngôn ngữ thông qua trình biên dịch Java, với bộ nạp lớp và bytecode xác minh và do đó vào máy ảo Java, mà chứa các thông dịch viên và thời gian chạy của hệ thống. Vấn đề quan trọng là trình tải lớp Java và trình xác minh bytecode không tạo ra các giả định về nguồn chính của luồng bytecode - mã có thể đến từ hệ thống cục bộ hoặc có thể đã đi nửa chừng trên khắp hành tinh. Trình xác minh bytecode hoạt động như một loại gatekeeper: nó đảm bảo rằng mã được truyền tới trình thông dịch Java ở trạng thái phù hợp để được thực hiện và có thể chạy mà không sợ phá vỡ trình thông dịch Java . Mã được nhập không được phép thực hiện bằng bất kỳ phương tiện nào cho đến khi nó đã vượt qua các kiểm tra của trình xác minh. Một khi xác minh được thực hiện, một số tính chất quan trọng được biết:

  • Không có toán hạng stack tràn hoặc underflows
  • Các loại các thông số của tất cả các hướng dẫn bytecode được biết là luôn luôn đúng
  • Các truy cập trường đối tượng được biết là hợp pháp - riêng tư, công khai hoặc được bảo vệ

Trong khi tất cả các kiểm tra này xuất hiện đầy đủ chi tiết, vào lúc trình xác minh bytecode đã thực hiện công việc của nó, Java int erpreter có thể tiếp tục, biết rằng mã sẽ chạy an toàn. Việc biết các thuộc tính này làm cho trình thông dịch Java nhanh hơn nhiều, bởi vì nó không phải kiểm tra bất cứ điều gì. Không có kiểm tra loại toán hạng và không có kiểm tra tràn ngăn xếp . Do đó, thông dịch viên có thể hoạt động ở tốc độ tối đa mà không ảnh hưởng đến độ tin cậy.

Các vấn đề liên quan