(ObjectWebのから)ASMはClassWriter(COMPUTE_MAX + COMPUTE_STACK)が設定されていても正しくMaxStackを計算していません
-
19-09-2019 - |
質問
私はASMを使用して生成したクラスをロードしようとしたとき、
私は期待ClassVerifyErrorsを取得しています。さらに検査で私は、JVMが正しいことを確認し、方法が話していることは、無効なMAX_STACK値を持つことができます。奇妙なことは、これが問題になることはありませんので、自動スタックおよび最大ローカルオプションを計算する使用しています... 無効なオプションを持つ方法は非常に簡単で、まだ結果は悪いバイトコードです。
私が意図したメソッドを持つクラスを書かれて、私のASMが生成し、バイトコードのみエラーが最大スタックされた状態で対戦のjavacは、2の値を設定しながら、間違っている0である何のjavacに対するクラスを生成し比較しました。
ID thaの最大スタック/地元の人々を自分で計算することを避けるために好きでます。
解決
バイトコードが有効でない場合は、
マックス・スタックおよび変数の計算が間違った結果を生成することができます。あなたは、生成されたコードを実行することにより、トラフことを確認することができますCheckClassAdapterする。
たとえば、
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// generate code into cw instance...
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);
所属していません StackOverflow