Gần đây tôi đã thực hiện một trình biên dịch ngược cho AVM2/AS3 và tôi đã nhận thấy rằng trình biên dịch Flash có xu hướng phát ra rất nhiều mã không cần thiết. Ví dụ: đối với một ứng dụng nhất định, tôi đã xóa khoảng 10% mã mà không bị suy giảm chức năng. Nó chỉ là một mã chết chắc chắn không được tham chiếu bởi các opcodes có điều kiện cũng như các khối xử lý ngoại lệ.Tại sao trình biên dịch Flash ActionScript3 phát ra mã không cần thiết?
Ngoài ra, nhìn vào đoạn mã này:
...
313 setproperty y
315 getlocal 12
317 returnvalue 318 jump L9
L3:
322 getlocal 8
324 returnvalue
L9:
325 jump L10 ; L10 (opcode #331) does not ever exist.
; Technically, it is a jump beyond
; the end of function. This is invalid code!
L2:
329 pushnull
330 returnvalue
Vâng, tất nhiên đây là mã không hợp lệ, cũng là chết và do đó sẽ không gây ra bất kỳ tác dụng phụ (trừ codebase đầy hơi). Nhưng tại sao nó lại phát ra mã đó? Và tại sao người xác minh lại chấp nhận điều đó?
Nó không được tham chiếu từ bảng ngoại lệ (vì không có nhiều thứ khác, lớn hơn nhiều - 10 hướng dẫn - khối mã chết) và đánh giá từ thông số kỹ thuật, bạn có thể chuyển quyền kiểm soát thông qua mã nhảy nhảy hoặc một ngoại lệ. Không có nhảy. – whitequark
@wvxvw Bằng cách này, 'cuối cùng' các khối được thực hiện trong AS3 với một hack lạ và quanh co, nơi trình biên dịch cố ý tạo ra các opcodes không hợp lệ để xác minh lừa và VM, một lần nữa cố ý, bỏ qua chúng. Flash chỉ là một WTF lớn. – whitequark
@wvxvw, tôi đã hiểu bạn đúng chưa? nếu bạn thực hiện một chuỗi các opcodes nhất định thì VM cho phép mã chạy để kiểm tra luồng opcode của nó bằng cách nào đó, có lẽ là thông qua việc đẩy chúng vào ngăn xếp dữ liệu? +50 nếu bạn có thể tìm thấy tài liệu tham khảo. – whitequark