Trong dự án thiết bị đo đạc bytecode của tôi, tôi thường xuyên vấp ngã trên VerifyErrors. Tuy nhiên, Trình xác minh java mặc định cung cấp ít thông tin về hướng dẫn nào dẫn đến lỗi (nó chỉ cung cấp phương thức và một thông báo nhỏ). Có bất kỳ trình xác minh bytecode độc lập nào cung cấp trợ giúp nâng cao hơn một chút trong việc định vị lỗi, ít nhất là vị trí lệnh chính xác không? Cảm ơn bạn.Độc lập Bytecode Verifier
Trả lời
ASM CheckClassAdaptor.verify() cung cấp cho phản hồi rất tốt: http://asm.ow2.org/
Tôi cũng đang tìm kiếm cái gì đó sẽ báo cáo tiềm năng xác minh lỗi, nhưng đặc biệt là IncompatibleClassChangeError
s. Tôi đã viết một dự án thử nghiệm nhỏ với một lớp API và một lớp ứng dụng khách gọi API khác, cộng với một lớp chính để chạy trình kiểm tra; sau đó thay đổi API, biên dịch lại nó nhưng không phải là khách hàng, và kiểm tra để xem những gì có thể bị bắt. Đã sử dụng -target 7
mặc dù không có tính năng JDK 7 đặc biệt nào cho bây giờ.
Đầu tiên và rõ ràng nhất, Class.forName
có thể tìm thấy lỗi nhất định trong chữ ký của lớp khách hàng, nhưng dường như không kiểm tra các phương thức gọi cho các phương thức API không tồn tại và tương tự, ngay cả khi bạn gọi getDeclaredMethods
; các lỗi được báo cáo bởi máy ảo chỉ khi dòng mã có vấn đề thực sự chạy.
JustIce trong BCEL 5.2 dường như là dễ nhất;
org.apache.bcel.verifier.Verifier.main(new String[] {clazz});
hiện công việc:
Pass 3a, method number 1 ['public void m()']:
VERIFIED_REJECTED
Instruction invokestatic[184](3) 4 constraint violated:
Referenced method 'x' with expected signature '()V' not found in class 'API'.
....
tôi đã cố gắng ASM 4.0, nhưng
org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz});
không hoạt động; có lẽ nó kiểm tra định dạng của các phương thức, nhưng không phải là liên kết. Inline main
và qua checkDataFlow=true
không giúp ích gì.
Tìm kiếm, tôi cũng tìm thấy https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java nhưng tôi không thể tìm thấy bất kỳ cách nào để thực hiện công việc này; kiểm tra đơn vị đi kèm sẽ ném một số ClassNotFoundException
khi chạy.
- 1. Trách nhiệm của JVM bytecode verifier
- 2. Lập trình bằng mã Java bytecode
- 3. Ứng dụng JavaFX độc lập
- 4. Thanh màu độc lập (matplotlib)
- 5. Thiết lập các ứng dụng độc lập cygwin
- 6. Thuật toán thiết lập độc lập tối đa
- 7. Phương pháp "chạm" jQuery độc lập?
- 8. Khóa tệp độc lập trên nền tảng?
- 9. Chuỗi công cụ độc lập là gì?
- 10. Nền tảng WCF có độc lập không?
- 11. cơ sở dữ liệu độc lập
- 12. Các trường hợp độc lập 'ngẫu nhiên'
- 13. Sử dụng Grails GORM độc lập
- 14. Nhóm regex độc lập là gì?
- 15. cách chạy thử nghiệm Capybara độc lập?
- 16. thư viện xác nhận độc lập?
- 17. Nhiều partials độc lập trong AngularJS
- 18. Tạo bản sao độc lập của UIBezierPath?
- 19. jar độc lập Grizzly và Jersey
- 20. Tạo các ứng dụng python độc lập
- 21. máy khách web java độc lập
- 22. Pixel độc lập của thiết bị
- 23. Spring-JDBC là thư viện độc lập
- 24. Cuộn cột độc lập trong trang HTML
- 25. UIBarButtonItem, thiết lập liên lạc độc quyền
- 26. Trình biên dịch VC++ độc lập
- 27. Biên dịch độc lập với Cygwin
- 28. Tạo ứng dụng độc lập với Maven
- 29. Thiết kế Bytecode?
- 30. Các mẫu thao tác Bytecode
Tại sao tôi không nghĩ về điều đó. Tôi đang thực sự sử dụng BCEL, nhưng nó không bao giờ xảy ra với tôi để kiểm tra xác minh của nó. Nó thực sự được gọi là JustIce. –