1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 /* 26 * This class should throw VerifyError because the StackMap for bytecode index 27 * 45 (astore_2, line 123) is incorrect. The stack maps for bytecode indexes 45 28 * and 49 (astore, line 133) do not match because 45 does not supply enough 29 * locals to satisfy 49. 30 * 31 * The astore_2 bytecode at bytecode index 45 changes the type state, 32 * preventing the stackmap mismatch. But, if the incoming type state is used, 33 * as required by JVM Spec 8, then the verifier will detected the stackmap 34 * mismatch, and throw VerifyError. 35 */ 36 37 super public class BadMap 38 version 51:0 39 { 40 41 42 public Method "<init>":"()V" 43 stack 1 locals 1 44 { 45 aload_0; 46 invokespecial Method java/lang/Object."<init>":"()V"; 47 return; 48 } 49 50 public static Method main:"([Ljava/lang/String;)V" 51 throws java/lang/Throwable 52 stack 0 locals 1 53 { 54 return; 55 } 56 57 public static Method foo:"()V" 58 stack 3 locals 5 59 { 60 iconst_0; 61 ifne L5; 62 nop; 63 try t7; 64 L5: stack_frame_type full; 65 aconst_null; 66 dup; 67 astore_0; 68 astore_1; 69 try t0; 70 aconst_null; 71 astore_0; 72 endtry t0; 73 goto L19; 74 catch t0 java/io/IOException; 75 stack_frame_type full; 76 locals_map class java/lang/Object, null; 77 stack_map class java/io/IOException; 78 astore_2; 79 aconst_null; 80 dup; 81 astore_1; 82 astore_0; 83 try t1; 84 L19: stack_frame_type full; 85 locals_map class java/lang/Object, class java/lang/Object; 86 aconst_null; 87 astore_2; 88 endtry t1; 89 aload_1; 90 ifnonnull L37; 91 nop; 92 goto L37; 93 catch t1 #0; 94 catch t2 #0; 95 try t2; 96 stack_frame_type full; 97 locals_map class java/lang/Object, class java/lang/Object; 98 stack_map class java/lang/Throwable; 99 astore_3; 100 endtry t2; 101 aload_1; 102 ifnonnull L35; 103 nop; 104 L35: stack_frame_type full; 105 locals_map class java/lang/Object, class java/lang/Object, bogus, class java/lang/Throwable; 106 aload_3; 107 athrow; 108 try t3, t4; 109 L37: stack_frame_type full; 110 locals_map class java/lang/Object, class java/lang/Object, class java/lang/Object; 111 aload_1; 112 ifnonnull L42; 113 nop; 114 endtry t3, t4; 115 L42: stack_frame_type full; 116 locals_map class java/lang/Object, class java/lang/Object, class java/lang/Object; 117 goto L54; 118 catch t3 java/lang/Exception; 119 try t5; 120 stack_frame_type full; 121 locals_map class java/lang/Object, class java/lang/Object; 122 stack_map class java/lang/Exception; 123 astore_2; // astore_2, at bci 45, that changes the type state. 124 endtry t5; 125 goto L54; 126 catch t4 #0; 127 catch t5 #0; 128 catch t6 #0; 129 try t6; 130 stack_frame_type full; 131 locals_map class java/lang/Object, class java/lang/Object, class java/lang/Object; 132 stack_map class java/lang/Throwable; 133 astore 4; 134 endtry t6; 135 aload 4; 136 athrow; 137 L54: stack_frame_type full; 138 locals_map class java/lang/Object, class java/lang/Object, class java/lang/Object; 139 goto L57; 140 L57: stack_frame_type full; 141 locals_map class java/lang/Object, class java/lang/Object, class java/lang/Object; 142 nop; 143 endtry t7; 144 return; 145 catch t7 #0; 146 stack_frame_type full; 147 stack_map class java/lang/Throwable; 148 nop; 149 athrow; 150 } 151 152 } // end Class BadMap