使用ASM从方法体中删除异常

时间:2014-12-24 09:02:15

标签: java java-bytecode-asm bytecode-manipulation

说明:

我有一个(混淆)方法,我使用ASM打印,输出如下:

METHOD: m(ZB)Lcc;
--------------------------------------

L0:
{
    ALOAD_0
    GETFIELD   d/x I
    LDC  2036719157
    IMUL
    ISTORE
    GOTO  L1
}

L2:
{
    ALOAD_6
    ICONST_0
    LDC  -373364649
    ALOAD_0
    GETFIELD   d/at I
    IMUL
    ICONST_0
    INVOKEVIRTUAL   cc/y(III)V
    GOTO  L3
}

L4:
{
    ACONST_NULL
    ARETURN
}

L5:
{
    ILOAD_1
    IFEQ  L6
    LDC  -723220973
    ALOAD_0
    GETFIELD   d/an I
    IMUL
    ISTORE
    LDC  1671960653
    ALOAD_0
    GETFIELD   d/ad I
    IMUL
    ISTORE
    GOTO  L7
}

L8:
{
    LDC  1955946639
    ALOAD_0
    GETFIELD   d/au I
    IMUL
    IFEQ  L9
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L10
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L11:
{
    IINC
    GOTO  L12
}

L7:
{
    LDC  894092883
    ALOAD_0
    GETFIELD   d/ac I
    IMUL
    ISTORE
    GOTO  L6
}

L13:
{
    GETSTATIC   d/b Lem;
    ILOAD_3
    ICONST_0
    INVOKESTATIC   cc/l(Lem;II)Lcc;
    ASTORE
    ILOAD_4
    ICONST_M1
    IF_ICMPEQ  L14
    GETSTATIC   d/b Lem;
    ILOAD_4
    ICONST_0
    INVOKESTATIC   cc/l(Lem;II)Lcc;
    ASTORE
    GOTO  L15
}

L16:
{
    ICONST_2
    ANEWARRAY
    DUP
    ICONST_0
    ALOAD_6
    AASTORE
    DUP
    ICONST_1
    ALOAD_7
    AASTORE
    ASTORE
    GOTO  L17
}

L18:
{
    GETSTATIC   d/b Lem;
    ILOAD_5
    ICONST_0
    INVOKESTATIC   cc/l(Lem;II)Lcc;
    ASTORE
    ICONST_3
    ANEWARRAY
    DUP
    ICONST_0
    ALOAD_6
    AASTORE
    DUP
    ICONST_1
    ALOAD_7
    AASTORE
    DUP
    ICONST_2
    ALOAD_8
    AASTORE
    ASTORE
    NEW
    DUP
    ALOAD_9
    ICONST_3
    INVOKESPECIAL   cc/<init>([Lcc;I)V
    ASTORE
    GOTO  L14
}

L19:
{
    ALOAD_6
    ARETURN
}

L17:
{
    NEW
    DUP
    ALOAD_8
    ICONST_2
    INVOKESPECIAL   cc/<init>([Lcc;I)V
    ASTORE
}

L14:
{
    ILOAD_1
    IFNE  L9
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L8
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L15:
{
    ILOAD_5
    ICONST_M1
    IF_ICMPEQ  L16
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L18
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L20:
{
    LDC  1642271889
    ALOAD_0
    GETFIELD   d/ay I
    IMUL
    ISTORE
    GOTO  L5
}

L9:
{
    ILOAD_1
    IFEQ  L3
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L21
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L21:
{
    ICONST_0
    LDC  -373364649
    ALOAD_0
    GETFIELD   d/at I
    IMUL
    IF_ICMPEQ  L3
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L2
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L22:
{
    ICONST_0
    ISTORE
    GOTO  L23
}

L3:
{
    ALOAD_0
    GETFIELD   d/c [S
    IFNULL  L24
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L25
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L25:
{
    ICONST_0
    ISTORE
    GOTO  L12
}

L24:
{
    ALOAD_0
    GETFIELD   d/a [S
    IFNULL  L19
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L22
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L26:
{
    ALOAD_6
    ALOAD_0
    GETFIELD   d/c [S
    ILOAD_7
    SALOAD
    ALOAD_0
    GETFIELD   d/m [S
    ILOAD_7
    SALOAD
    INVOKEVIRTUAL   cc/v(SS)V
    GOTO  L11
}

L12:
{
    ILOAD_7
    ALOAD_0
    GETFIELD   d/c [S
    ARRAYLENGTH
    IF_ICMPGE  L24
    GOTO  L26
}

L1:
{
    ALOAD_0
    GETFIELD   d/ar I
    LDC  608958183
    IMUL
    ISTORE
    GOTO  L20
}

L10:
{
    ALOAD_6
    ICONST_0
    LDC  1955946639
    ALOAD_0
    GETFIELD   d/au I
    IMUL
    ICONST_0
    INVOKEVIRTUAL   cc/y(III)V
    GOTO  L9
}

L23:
{
    ILOAD_7
    ALOAD_0
    GETFIELD   d/a [S
    ARRAYLENGTH
    IF_ICMPGE  L19
    ILOAD_2
    ICONST_1
    IF_ICMPEQ  L27
    NEW
    DUP
    INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
    ATHROW
}

L27:
{
    ALOAD_6
    ALOAD_0
    GETFIELD   d/a [S
    ILOAD_7
    SALOAD
    ALOAD_0
    GETFIELD   d/e [S
    ILOAD_7
    SALOAD
    INVOKEVIRTUAL   cc/s(SS)V
    IINC
    GOTO  L23
}

L6:
{
    ILOAD_3
    ICONST_M1
    IF_ICMPNE  L13
    GOTO  L4
}

L28:
{
    NEW
    DUP
    INVOKESPECIAL   java/lang/StringBuilder/<init>()V
    LDC  "af.m("
    INVOKEVIRTUAL   java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC  41
    INVOKEVIRTUAL   java/lang/StringBuilder/append(C)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL   java/lang/StringBuilder/toString()Ljava/lang/String;
    INVOKESTATIC   b/b(Ljava/lang/Throwable;Ljava/lang/String;)Lcd;
    ATHROW
}

我想要的是什么:

我想删除所有例外情况。例如(我想删除):

ILOAD_2
ICONST_1
IF_ICMPEQ  L27
NEW
DUP
INVOKESPECIAL   java/lang/IllegalStateException/<init>()V
ATHROW

翻译为:if (var2 != 1) {throw new IllegalStateException();}

我不计划上课,但我确实计划正确组装。这意味着如果我删除了异常,使用CheckClassAdapter时就不会出现任何字节码错误。我不需要代码实际工作。

我尝试了什么:

我尝试了以下用于删除例外的内容:

private void findException(MethodNode method) {
    int i = findExceptionIndex(method); //returns the first occurrence of the above pattern.

    while (i != -1) {
        for (int j = i; j < i + 7; ++j) { //length of if statement + exception instructions.
            if (method.instructions.get(j) instanceof MethodInsnNode) {

                //if it really is an exception
                if (((MethodInsnNode) method.instructions.get(j)).owner.contains("Exception")) {

                    for (int k = i + 6; k != i - 1; --k) {
                        System.out.println("Removing: " + Printer.OPCODES[method.instructions.get(k).getOpcode()]);
                        method.instructions.remove(method.instructions.get(k));
                    }
                    return; //I only want to try to remove one first (before trying to remove all)
                }
            }
        }
        i = findNextExceptionIndex(method, i);
    }
}

并打印(成功删除了具有以下操作码的第一个异常):

Removing: ATHROW
Removing: INVOKESPECIAL
Removing: DUP
Removing: NEW
Removing: IF_ICMPEQ
Removing: ICONST_1
Removing: ILOAD

错误:

但是,当我尝试保存该类时,我收到了一个巨大的异常:

jdk.internal.org.objectweb.asm.tree.analysis.AnalyzerException: Error at instruction 41: Expected I, but found .
    at jdk.internal.org.objectweb.asm.tree.analysis.Analyzer.analyze(Analyzer.java:323)
    at jdk.internal.org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(CheckMethodAdapter.java:479)
    at jdk.internal.org.objectweb.asm.MethodVisitor.visitEnd(MethodVisitor.java:906)
    at jdk.internal.org.objectweb.asm.util.CheckMethodAdapter.visitEnd(CheckMethodAdapter.java:1057)
    at jdk.internal.org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:866)
    at jdk.internal.org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:755)
    at jdk.internal.org.objectweb.asm.tree.ClassNode.accept(ClassNode.java:441)
    at com.other.JarParser.saveClass(JarParser.java:81)
Caused by: jdk.internal.org.objectweb.asm.tree.analysis.AnalyzerException: Expected I, but found .
    at jdk.internal.org.objectweb.asm.tree.analysis.BasicVerifier.unaryOperation(BasicVerifier.java:211)
    at jdk.internal.org.objectweb.asm.tree.analysis.BasicVerifier.unaryOperation(BasicVerifier.java:76)
    at jdk.internal.org.objectweb.asm.tree.analysis.Frame.execute(Frame.java:546)
    at jdk.internal.org.objectweb.asm.tree.analysis.Analyzer.analyze(Analyzer.java:228)
    ... 14 more
Exception in thread "main" java.lang.RuntimeException: Error at instruction 41: Expected I, but found . m(ZB)Lcc;
00000 R I I . . . . . . .  :  :    L0
00001 R I I . . . . . . .  :  :     ALOAD 0
00002 R I I . . . . . . .  : R  :     GETFIELD d.x : I
00003 R I I . . . . . . .  : I  :     LDC 2036719157
00004 R I I . . . . . . .  : I I  :     IMUL
00005 R I I . . . . . . .  : I  :     ISTORE 3
00006 R I I I . . . . . .  :  :     GOTO L1
00007 R I I I I I R . . .  :  :    L2
00008 R I I I I I R . . .  :  :     ALOAD 6
00009 R I I I I I R . . .  : R  :     ICONST_0
00010 R I I I I I R . . .  : R I  :     LDC -373364649
00011 R I I I I I R . . .  : R I I  :     ALOAD 0
00012 R I I I I I R . . .  : R I I R  :     GETFIELD d.at : I
00013 R I I I I I R . . .  : R I I I  :     IMUL
00014 R I I I I I R . . .  : R I I  :     ICONST_0
00015 R I I I I I R . . .  : R I I I  :     INVOKEVIRTUAL cc.y (III)V
00016 R I I I I I R . . .  :  :     GOTO L3
00017 ?               :    L4
00018 ?               :     ACONST_NULL
00019 ?               :     ARETURN
00020 R I I I I I . . . .  :  :    L5
00021 R I I I I I . . . .  :  :     ILOAD 1
00022 R I I I I I . . . .  : I  :     IFEQ L6
00023 R I I I I I . . . .  :  :     LDC -723220973
00024 ?               :     ALOAD 0
00025 ?               :     GETFIELD d.an : I
00026 ?               :     IMUL
00027 ?               :     ISTORE 3
00028 ?               :     LDC 1671960653
00029 ?               :     ALOAD 0
00030 ?               :     GETFIELD d.ad : I
00031 ?               :     IMUL
00032 ?               :     ISTORE 4
00033 ?               :     GOTO L7
00034 R I I I I I R . . .  :  :    L8
00035 R I I I I I R . . .  :  :     LDC 1955946639
00036 R I I I I I R . . .  : I  :     ALOAD 0
00037 R I I I I I R . . .  : I R  :     GETFIELD d.au : I
00038 R I I I I I R . . .  : I I  :     IMUL
00039 R I I I I I R . . .  : I  :     IFEQ L9
00040 R I I I I I R . . .  :  :    L10
00041 R I I I I I R . . .  :  :     IINC 7 1
00042 R I I I I I R I . .  :  :     GOTO L11
00043 ?               :    L7
00044 ?               :     LDC 894092883
00045 ?               :     ALOAD 0
00046 ?               :     GETFIELD d.ac : I
00047 ?               :     IMUL
00048 ?               :     ISTORE 5
00049 ?               :     GOTO L6
00050 R I I I I I . . . .  :  :    L12
00051 R I I I I I . . . .  :  :     GETSTATIC d.b : Lem;
00052 R I I I I I . . . .  : R  :     ILOAD 3
00053 R I I I I I . . . .  : R I  :     ICONST_0
00054 R I I I I I . . . .  : R I I  :     INVOKESTATIC cc.l (Lem;II)Lcc;
00055 R I I I I I . . . .  : R  :     ASTORE 6
00056 R I I I I I R . . .  :  :     ILOAD 4
00057 R I I I I I R . . .  : I  :     ICONST_M1
00058 R I I I I I R . . .  : I I  :     IF_ICMPEQ L13
00059 R I I I I I R . . .  :  :     GETSTATIC d.b : Lem;
00060 ?               :     ILOAD 4
00061 ?               :     ICONST_0
00062 ?               :     INVOKESTATIC cc.l (Lem;II)Lcc;
00063 ?               :     ASTORE 7
00064 ?               :     GOTO L14
00065 ?               :    L15
00066 ?               :     ICONST_2
00067 ?               :     ANEWARRAY cc
00068 ?               :     DUP
00069 ?               :     ICONST_0
00070 ?               :     ALOAD 6
00071 ?               :     AASTORE
00072 ?               :     DUP
00073 ?               :     ICONST_1
00074 ?               :     ALOAD 7
00075 ?               :     AASTORE
00076 ?               :     ASTORE 8
00077 ?               :     GOTO L16
00078 ?               :    L17
00079 ?               :     GETSTATIC d.b : Lem;
00080 ?               :     ILOAD 5
00081 ?               :     ICONST_0
00082 ?               :     INVOKESTATIC cc.l (Lem;II)Lcc;
00083 ?               :     ASTORE 8
00084 ?               :     ICONST_3
00085 ?               :     ANEWARRAY cc
00086 ?               :     DUP
00087 ?               :     ICONST_0
00088 ?               :     ALOAD 6
00089 ?               :     AASTORE
00090 ?               :     DUP
00091 ?               :     ICONST_1
00092 ?               :     ALOAD 7
00093 ?               :     AASTORE
00094 ?               :     DUP
00095 ?               :     ICONST_2
00096 ?               :     ALOAD 8
00097 ?               :     AASTORE
00098 ?               :     ASTORE 9
00099 ?               :     NEW cc
00100 ?               :     DUP
00101 ?               :     ALOAD 9
00102 ?               :     ICONST_3
00103 ?               :     INVOKESPECIAL cc.<init> ([Lcc;I)V
00104 ?               :     ASTORE 6
00105 ?               :     GOTO L13
00106 R I I I I I R . . .  :  :    L18
00107 R I I I I I R . . .  :  :     ALOAD 6
00108 R I I I I I R . . .  : R  :     ARETURN
00109 ?               :    L16
00110 ?               :     NEW cc
00111 ?               :     DUP
00112 ?               :     ALOAD 8
00113 ?               :     ICONST_2
00114 ?               :     INVOKESPECIAL cc.<init> ([Lcc;I)V
00115 ?               :     ASTORE 6
00116 R I I I I I R . . .  :  :    L13
00117 R I I I I I R . . .  :  :     ILOAD 1
00118 R I I I I I R . . .  : I  :     IFNE L9
00119 R I I I I I R . . .  :  :     ILOAD 2
00120 R I I I I I R . . .  : I  :     ICONST_1
00121 R I I I I I R . . .  : I I  :     IF_ICMPEQ L8
00122 R I I I I I R . . .  :  :     NEW java/lang/IllegalStateException
00123 ?               :     DUP
00124 ?               :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00125 ?               :     ATHROW
00126 ?               :    L14
00127 ?               :     ILOAD 5
00128 ?               :     ICONST_M1
00129 ?               :     IF_ICMPEQ L15
00130 ?               :     ILOAD 2
00131 ?               :     ICONST_1
00132 ?               :     IF_ICMPEQ L17
00133 ?               :     NEW java/lang/IllegalStateException
00134 ?               :     DUP
00135 ?               :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00136 ?               :     ATHROW
00137 R I I I I . . . . .  :  :    L19
00138 R I I I I . . . . .  :  :     LDC 1642271889
00139 R I I I I . . . . .  : I  :     ALOAD 0
00140 R I I I I . . . . .  : I R  :     GETFIELD d.ay : I
00141 R I I I I . . . . .  : I I  :     IMUL
00142 R I I I I . . . . .  : I  :     ISTORE 5
00143 R I I I I I . . . .  :  :     GOTO L5
00144 R I I I I I R . . .  :  :    L9
00145 R I I I I I R . . .  :  :     ILOAD 1
00146 R I I I I I R . . .  : I  :     IFEQ L3
00147 R I I I I I R . . .  :  :     ILOAD 2
00148 R I I I I I R . . .  : I  :     ICONST_1
00149 R I I I I I R . . .  : I I  :     IF_ICMPEQ L20
00150 R I I I I I R . . .  :  :     NEW java/lang/IllegalStateException
00151 R I I I I I R . . .  : R  :     DUP
00152 R I I I I I R . . .  : R R  :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00153 R I I I I I R . . .  : R  :     ATHROW
00154 R I I I I I R . . .  :  :    L20
00155 R I I I I I R . . .  :  :     ICONST_0
00156 R I I I I I R . . .  : I  :     LDC -373364649
00157 R I I I I I R . . .  : I I  :     ALOAD 0
00158 R I I I I I R . . .  : I I R  :     GETFIELD d.at : I
00159 R I I I I I R . . .  : I I I  :     IMUL
00160 R I I I I I R . . .  : I I  :     IF_ICMPEQ L3
00161 R I I I I I R . . .  :  :     ILOAD 2
00162 R I I I I I R . . .  : I  :     ICONST_1
00163 R I I I I I R . . .  : I I  :     IF_ICMPEQ L2
00164 R I I I I I R . . .  :  :     NEW java/lang/IllegalStateException
00165 R I I I I I R . . .  : R  :     DUP
00166 R I I I I I R . . .  : R R  :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00167 R I I I I I R . . .  : R  :     ATHROW
00168 R I I I I I R . . .  :  :    L21
00169 R I I I I I R . . .  :  :     ICONST_0
00170 R I I I I I R . . .  : I  :     ISTORE 7
00171 R I I I I I R I . .  :  :     GOTO L22
00172 R I I I I I R . . .  :  :    L3
00173 R I I I I I R . . .  :  :     ALOAD 0
00174 R I I I I I R . . .  : R  :     GETFIELD d.c : [S
00175 R I I I I I R . . .  : R  :     IFNULL L23
00176 R I I I I I R . . .  :  :     ILOAD 2
00177 R I I I I I R . . .  : I  :     ICONST_1
00178 R I I I I I R . . .  : I I  :     IF_ICMPEQ L24
00179 R I I I I I R . . .  :  :     NEW java/lang/IllegalStateException
00180 R I I I I I R . . .  : R  :     DUP
00181 R I I I I I R . . .  : R R  :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00182 R I I I I I R . . .  : R  :     ATHROW
00183 R I I I I I R . . .  :  :    L24
00184 R I I I I I R . . .  :  :     ICONST_0
00185 R I I I I I R . . .  : I  :     ISTORE 7
00186 R I I I I I R I . .  :  :     GOTO L11
00187 R I I I I I R . . .  :  :    L23
00188 R I I I I I R . . .  :  :     ALOAD 0
00189 R I I I I I R . . .  : R  :     GETFIELD d.a : [S
00190 R I I I I I R . . .  : R  :     IFNULL L18
00191 R I I I I I R . . .  :  :     ILOAD 2
00192 R I I I I I R . . .  : I  :     ICONST_1
00193 R I I I I I R . . .  : I I  :     IF_ICMPEQ L21
00194 R I I I I I R . . .  :  :     NEW java/lang/IllegalStateException
00195 R I I I I I R . . .  : R  :     DUP
00196 R I I I I I R . . .  : R R  :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00197 R I I I I I R . . .  : R  :     ATHROW
00198 R I I I I I R I . .  :  :    L25
00199 R I I I I I R I . .  :  :     ALOAD 6
00200 R I I I I I R I . .  : R  :     ALOAD 0
00201 R I I I I I R I . .  : R R  :     GETFIELD d.c : [S
00202 R I I I I I R I . .  : R R  :     ILOAD 7
00203 R I I I I I R I . .  : R R I  :     SALOAD
00204 R I I I I I R I . .  : R I  :     ALOAD 0
00205 R I I I I I R I . .  : R I R  :     GETFIELD d.m : [S
00206 R I I I I I R I . .  : R I R  :     ILOAD 7
00207 R I I I I I R I . .  : R I R I  :     SALOAD
00208 R I I I I I R I . .  : R I I  :     INVOKEVIRTUAL cc.v (SS)V
00209 R I I I I I R I . .  :  :     GOTO L10
00210 R I I I I I R I . .  :  :    L11
00211 R I I I I I R I . .  :  :     ILOAD 7
00212 R I I I I I R I . .  : I  :     ALOAD 0
00213 R I I I I I R I . .  : I R  :     GETFIELD d.c : [S
00214 R I I I I I R I . .  : I R  :     ARRAYLENGTH
00215 R I I I I I R I . .  : I I  :     IF_ICMPGE L23
00216 R I I I I I R I . .  :  :     GOTO L25
00217 R I I I . . . . . .  :  :    L1
00218 R I I I . . . . . .  :  :     ALOAD 0
00219 R I I I . . . . . .  : R  :     GETFIELD d.ar : I
00220 R I I I . . . . . .  : I  :     LDC 608958183
00221 R I I I . . . . . .  : I I  :     IMUL
00222 R I I I . . . . . .  : I  :     ISTORE 4
00223 R I I I I . . . . .  :  :     GOTO L19
00224 ?               :    L26
00225 ?               :     ALOAD 6
00226 ?               :     ICONST_0
00227 ?               :     LDC 1955946639
00228 ?               :     ALOAD 0
00229 ?               :     GETFIELD d.au : I
00230 ?               :     IMUL
00231 ?               :     ICONST_0
00232 ?               :     INVOKEVIRTUAL cc.y (III)V
00233 ?               :     GOTO L9
00234 R I I I I I R I . .  :  :    L22
00235 R I I I I I R I . .  :  :     ILOAD 7
00236 R I I I I I R I . .  : I  :     ALOAD 0
00237 R I I I I I R I . .  : I R  :     GETFIELD d.a : [S
00238 R I I I I I R I . .  : I R  :     ARRAYLENGTH
00239 R I I I I I R I . .  : I I  :     IF_ICMPGE L18
00240 R I I I I I R I . .  :  :     ILOAD 2
00241 R I I I I I R I . .  : I  :     ICONST_1
00242 R I I I I I R I . .  : I I  :     IF_ICMPEQ L27
00243 R I I I I I R I . .  :  :     NEW java/lang/IllegalStateException
00244 R I I I I I R I . .  : R  :     DUP
00245 R I I I I I R I . .  : R R  :     INVOKESPECIAL java/lang/IllegalStateException.<init> ()V
00246 R I I I I I R I . .  : R  :     ATHROW
00247 R I I I I I R I . .  :  :    L27
00248 R I I I I I R I . .  :  :     ALOAD 6
00249 R I I I I I R I . .  : R  :     ALOAD 0
00250 R I I I I I R I . .  : R R  :     GETFIELD d.a : [S
00251 R I I I I I R I . .  : R R  :     ILOAD 7
00252 R I I I I I R I . .  : R R I  :     SALOAD
00253 R I I I I I R I . .  : R I  :     ALOAD 0
00254 R I I I I I R I . .  : R I R  :     GETFIELD d.e : [S
00255 R I I I I I R I . .  : R I R  :     ILOAD 7
00256 R I I I I I R I . .  : R I R I  :     SALOAD
00257 R I I I I I R I . .  : R I I  :     INVOKEVIRTUAL cc.s (SS)V
00258 R I I I I I R I . .  :  :     IINC 7 1
00259 R I I I I I R I . .  :  :     GOTO L22
00260 R I I I I I . . . .  :  :    L6
00261 R I I I I I . . . .  :  :     ILOAD 3
00262 R I I I I I . . . .  : I  :     ICONST_M1
00263 R I I I I I . . . .  : I I  :     IF_ICMPNE L12
00264 R I I I I I . . . .  :  :     GOTO L4
00265 R I I . . . . . . .  : R  :    L28
00266 R I I . . . . . . .  : R  :     NEW java/lang/StringBuilder
00267 R I I . . . . . . .  : R R  :     DUP
00268 R I I . . . . . . .  : R R R  :     INVOKESPECIAL java/lang/StringBuilder.<init> ()V
00269 R I I . . . . . . .  : R R  :     LDC "af.m("
00270 R I I . . . . . . .  : R R R  :     INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
00271 R I I . . . . . . .  : R R  :     LDC 41
00272 R I I . . . . . . .  : R R I  :     INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
00273 R I I . . . . . . .  : R R  :     INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
00274 R I I . . . . . . .  : R R  :     INVOKESTATIC b.b (Ljava/lang/Throwable;Ljava/lang/String;)Lcd;
00275 R I I . . . . . . .  : R  :     ATHROW
     TRYCATCHBLOCK L0 L28 L28 java/lang/RuntimeException

问题:

如何正确删除异常,以免我收到上述错误?这似乎是一个“框架”错误/问题,但我不知道如何解决它。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

删除athrow指令会删除控制流图中的边缘,因此如果执行不属于以前包含athrow的块,则验证程序现在必须证明代码是安全的。在这种情况下,它无法确保本地已初始化为第41行的iinc指令的int。

最简单的解决方案是使用常量返回值替换new; dup; invokespecial java/lang/IllegalStateException/<init>()V; athrow序列(在本例中为aconst_null; aret,但这将更改为与返回类型匹配)。这使验证者能够证明控制不会退出块。 (请注意,这会通过不分支到catch块来有效地跳过finally个处理程序。)

在评论中,querent解释说他们正在进行控制流去混淆。通常,您最好使用显式控制流图来构建高级SSA样式的IR并对其进行转换,而不是在操作数堆栈和局部变量的级别上工作。在这样的IR上,很容易说'我知道这个分支永远不会被取代,用跳转到未被占用的块'替换它。这样的IR需要花费一些精力来构建(通过一些现有的分析框架,比如Soot),但是如果你进行多个转换或者需要处理许多不同的代码模式(如此简单的模式)它会多次收回成本匹配字节码序列是无效的。)