Ho recentemente creato un decompilatore per AVM2/AS3 e ho notato che il compilatore Flash tende a emettere un sacco di codice inutile. Ad esempio, per una determinata applicazione ho rimosso circa il 10% del codice senza alcun danno alla funzionalità. Era solo un codice sicuramente non referenziato dagli opcode condizionali, né dai blocchi di gestione delle eccezioni.Perché il compilatore Flash ActionScript3 emette codice non necessario?
Inoltre, un'occhiata a questo frammento:
...
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
Beh, naturalmente questo è il codice valido, che è anche morto e quindi non provoca effetti negativi (ad eccezione del codebase gonfiore). Ma perché emette mai quel codice? E perché il verificatore lo accetta?
Non è stato fatto riferimento da una tabella di eccezioni (come non erano molti altri, molto più grandi - 10 di istruzioni - blocchi di codice morto) e, a giudicare dalle specifiche, è possibile trasferire il controllo tramite un opcode di salto o un'eccezione. Non ci sono nemmeno salti. – whitequark
@wvxvw A proposito, i blocchi 'finally' sono fatti in AS3 con un trucco strano e subdolo, in cui il compilatore genera deliberatamente codici opzionali non validi per ingannare il verificatore e VM, di nuovo deliberatamente, li ignora. Flash è solo un enorme WTF. – whitequark
@wvxvw, ho capito bene? se si esegue una determinata sequenza di codici opzionali, la VM consente al codice in esecuzione di esaminare il proprio flusso opcode in qualche modo, presumibilmente attraverso il loro invio allo stack di dati? +50 se trovi i riferimenti. – whitequark