2012-05-10 26 views
15

Đi qua một số bản trình bày, tôi đã đi qua xác nhận quyền sở hữu sau đây: Khi JVM tải một lớp, nó có thể phân tích nội dung của nó và đảm bảo không có tràn hoặc tràn của toán hạng ngăn xếp. Tôi đã tìm thấy a lot of sources thực hiện xác nhận quyền sở hữu tương tự nhưng không xác định cách thực hiện.Làm thế nào để JVM xác minh không có tràn bộ đệm toán hạng tiềm năng khi tải một lớp?

Tôi không rõ ràng cách xác minh đó có thể được thực hiện bằng cách sử dụng phân tích tĩnh. Giả sử tôi có một phương thức (độc hại) nhận giá trị như một đối số và sử dụng nó để thực hiện một loạt các pop. Tại thời gian tải, số lần lặp lại không được biết, vì nó phụ thuộc vào đối số được đưa ra bởi người gọi của phương thức. Vì vậy, có vẻ như với tôi rằng chỉ trong thời gian chạy, nó có thể được xác định xem sẽ có một dòng chảy hay không. Tôi đang thiếu gì ở đây?

+0

Trình xác thực có thể từ chối mọi nỗ lực bật trong vòng lặp. –

+0

@MarkoTopolnik, tôi đã sử dụng 'pop' làm ví dụ rõ ràng nhất. Các lệnh popping khác cũng có thể được sử dụng, chẳng hạn như 'store's khác nhau. – eran

+0

OK, vậy bạn có thấy bất kỳ trường hợp hợp pháp nào mà mã sẽ vượt quá số lần bật (bằng bất kỳ lệnh nào) liên quan đến các bước đẩy trong vòng lặp không? –

Trả lời

10

Bạn có thể tìm mô tả cơ bản về Trình xác minh Bytecode trong Java Virtual Machine specification.

Để đặt nó đơn giản, độ sâu ngăn xếp được biết ở mọi điểm phân nhánh và hai đường dẫn thực hiện hợp nhất tại cùng một điểm hợp nhất cũng phải có cùng độ sâu ngăn xếp. Vì vậy, trình xác minh sẽ không cho phép bạn thực hiện hàng loạt các cửa sổ mà không cần đặt tương ứng.

+0

Cảm ơn bạn đã liên kết (và giải thích đơn giản). Tôi tự hỏi tác động của giới hạn này đối với hiệu quả của bytecode ở thời gian chạy (ví dụ: không thể có vòng lặp đẩy nội dung và sau đó là vòng lặp sử dụng công cụ đó trong khi popping nó). Nhưng đó là cách vượt ra ngoài phạm vi của câu hỏi này. – eran

+0

Vấn đề duy nhất tôi biết là tối ưu hóa đệ quy đuôi. Nhưng nó có thể giải quyết ở cấp độ phương pháp, vì vậy các quy tắc xác minh tương tự sẽ được áp dụng. Nếu tôi không nhầm lẫn trong công việc JVM đã được thực hiện để hỗ trợ nó. Nó không ảnh hưởng đến bytecode, nhưng trình biên dịch JIT dịch nó sang mã gốc. –

5

Mã của phương thức được chia thành các khối thực thi. Một "khối" là một chuỗi các hướng dẫn có thể được thực hiện mà không cần nhảy ra hoặc vào. Các khối xây dựng một đồ thị có hướng của tất cả các đường dẫn thực hiện có thể.

Khối luôn mong đợi kích thước ngăn xếp nhất định ở đầu và có kích thước ngăn xếp cố định ở cuối của nó (bắt đầu + tất cả các lần đẩy - tất cả các cửa sổ bật lên). Trình kiểm tra xác minh rằng đối với tất cả các khối 'a' có thể đạt được từ một khối đã cho 'b', kích thước ngăn xếp cuối của b khớp với kích thước ngăn xếp bắt đầu của a.

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