Kısa bir süre önce AVM2/AS3 için bir decompiler ürettim ve Flash derleyicisinin çok fazla gereksiz kod yayma eğiliminde olduğunu fark ettim. Örneğin, belirli bir uygulama için kodun% 10'unu işlevselliğe herhangi bir bozulma olmaksızın kaldırdım. Koşullu opcodes tarafından atıfta bulunulan ve kesinlikle istisna tutma blokları tarafından atıfta bulunulan bir kesinlikle ölü koddu.Flash ActionScript3 derleyicisi neden gereksiz kod yayar?
Ayrıca, bu pasajı bakmak:
...
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
Tabii bu da öldü ve dolayısıyla (kod temeli şişkinlik hariç) herhangi bir olumsuz etkilere neden olmaz geçersiz koddur. Ama neden bu kodu yayıyor? Ve neden doğrulayıcı bunu kabul ediyor?
Bir istisna tablosundan referans alınmadı (diğer pek çok, daha büyük - 10'lu yönergeler - ölü kod blokları gibi) ve speklerden yargılanarak, ya bir kontrol opoğu aracılığıyla denetimi aktarabilirsiniz veya bir istisna. Ya atlayış yok. – whitequark
@wvxvw Bu arada, 'nihayet' blokları AS3'te garip ve dolambaçlı bir hack ile yapılıyor, burada derleyici kasıtlı olarak doğrulayıcı kodları ve VM'yi kasten geçersiz kılar ve bunları kasten yok sayar. Flash sadece büyük bir WTF. – whitequark
@wvxvw, seni doğru anladım mı? Belirli bir opcodes dizisini yürütürseniz, VM, çalışan kodun veri kümesine iterek muhtemelen bir şekilde opcode akışını incelemesine izin verir. Referansları bulabiliyorsanız +50. – whitequark