我有一个(混淆)方法,我使用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
如何正确删除异常,以免我收到上述错误?这似乎是一个“框架”错误/问题,但我不知道如何解决它。有什么想法吗?
答案 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),但是如果你进行多个转换或者需要处理许多不同的代码模式(如此简单的模式)它会多次收回成本匹配字节码序列是无效的。)