1 /* 2 * Copyright (c) 2022, 2025, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package jdk.internal.classfile.impl.verifier; 26 27 import java.lang.classfile.ClassHierarchyResolver; 28 import java.lang.classfile.ClassModel; 29 import jdk.internal.classfile.components.ClassPrinter; 30 import java.util.ArrayList; 31 import java.util.Collections; 32 import java.util.List; 33 import java.util.function.Consumer; 34 35 import jdk.internal.classfile.impl.ClassHierarchyImpl; 36 import jdk.internal.classfile.impl.RawBytecodeHelper; 37 import jdk.internal.classfile.impl.verifier.VerificationSignature.BasicType; 38 import jdk.internal.classfile.impl.verifier.VerificationWrapper.ConstantPoolWrapper; 39 40 import static jdk.internal.classfile.impl.RawBytecodeHelper.*; 41 import static jdk.internal.classfile.impl.verifier.VerificationFrame.FLAG_THIS_UNINIT; 42 import static jdk.internal.classfile.impl.verifier.VerificationSignature.BasicType.T_BOOLEAN; 43 import static jdk.internal.classfile.impl.verifier.VerificationSignature.BasicType.T_LONG; 44 45 /// VerifierImpl performs selected checks and verifications of the class file 46 /// format according to {@jvms 4.8 Format Checking}, 47 /// {@jvms 4.9 Constraints on Java Virtual Machine code}, 48 /// {@jvms 4.10 Verification of class Files} and {@jvms 6.5 Instructions} 49 /// 50 /// From `verifier.cpp`. 51 public final class VerifierImpl { 52 static final int 53 JVM_CONSTANT_Utf8 = 1, 54 JVM_CONSTANT_Unicode = 2, 55 JVM_CONSTANT_Integer = 3, 56 JVM_CONSTANT_Float = 4, 57 JVM_CONSTANT_Long = 5, 58 JVM_CONSTANT_Double = 6, 59 JVM_CONSTANT_Class = 7, 60 JVM_CONSTANT_String = 8, 61 JVM_CONSTANT_Fieldref = 9, 62 JVM_CONSTANT_Methodref = 10, 63 JVM_CONSTANT_InterfaceMethodref = 11, 64 JVM_CONSTANT_NameAndType = 12, 65 JVM_CONSTANT_MethodHandle = 15, 66 JVM_CONSTANT_MethodType = 16, 67 JVM_CONSTANT_Dynamic = 17, 68 JVM_CONSTANT_InvokeDynamic = 18, 69 JVM_CONSTANT_Module = 19, 70 JVM_CONSTANT_Package = 20, 71 JVM_CONSTANT_ExternalMax = 20; 72 73 static final char JVM_SIGNATURE_SPECIAL = '<', 74 JVM_SIGNATURE_ARRAY = '[', 75 JVM_SIGNATURE_BYTE = 'B', 76 JVM_SIGNATURE_CHAR = 'C', 77 JVM_SIGNATURE_CLASS = 'L', 78 JVM_SIGNATURE_FLOAT = 'F', 79 JVM_SIGNATURE_DOUBLE = 'D', 80 JVM_SIGNATURE_INT = 'I', 81 JVM_SIGNATURE_LONG = 'J', 82 JVM_SIGNATURE_SHORT = 'S', 83 JVM_SIGNATURE_BOOLEAN = 'Z'; 84 85 static final String java_lang_String = "java/lang/String"; 86 static final String object_initializer_name = "<init>"; 87 static final String java_lang_invoke_MethodHandle = "java/lang/invoke/MethodHandle"; 88 static final String java_lang_Object = "java/lang/Object"; 89 static final String java_lang_invoke_MethodType = "java/lang/invoke/MethodType"; 90 static final String java_lang_Throwable = "java/lang/Throwable"; 91 static final String java_lang_Class = "java/lang/Class"; 92 93 String errorContext = ""; 94 private int bci; 95 96 static void log_info(Consumer<String> logger, String messageFormat, Object... args) { 97 if (logger != null) logger.accept(String.format(messageFormat + "%n", args)); 98 } 99 private final Consumer<String> _logger; 100 void log_info(String messageFormat, Object... args) { 101 log_info(_logger, messageFormat, args); 102 } 103 104 105 static final int STACKMAP_ATTRIBUTE_MAJOR_VERSION = 50; 106 static final int INVOKEDYNAMIC_MAJOR_VERSION = 51; 107 static final int NOFAILOVER_MAJOR_VERSION = 51; 108 static final int MAX_CODE_SIZE = 65535; 109 110 public static List<VerifyError> verify(ClassModel classModel, Consumer<String> logger) { 111 return verify(classModel, ClassHierarchyResolver.defaultResolver(), logger); 112 } 113 114 public static List<VerifyError> verify(ClassModel classModel, ClassHierarchyResolver classHierarchyResolver, Consumer<String> logger) { 115 String clsName = classModel.thisClass().asInternalName(); 116 log_info(logger, "Start class verification for: %s", clsName); 117 try { 118 var klass = new VerificationWrapper(classModel); 119 var errors = new ArrayList<VerifyError>(); 120 errors.addAll(new ParserVerifier(classModel).verify()); 121 if (is_eligible_for_verification(klass)) { 122 if (klass.majorVersion() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) { 123 var verifierErrors = new VerifierImpl(klass, classHierarchyResolver, logger).verify_class(); 124 if (!verifierErrors.isEmpty() && klass.majorVersion() < NOFAILOVER_MAJOR_VERSION) { 125 log_info(logger, "Fail over class verification to old verifier for: %s", klass.thisClassName()); 126 errors.addAll(inference_verify(klass)); 127 } else { 128 errors.addAll(verifierErrors); 129 } 130 } else { 131 errors.addAll(inference_verify(klass)); 132 } 133 } 134 return Collections.unmodifiableList(errors); 135 } finally { 136 log_info(logger, "End class verification for: %s", clsName); 137 } 138 } 139 140 public static boolean is_eligible_for_verification(VerificationWrapper klass) { 141 // 8330606 Not applicable here 142 return true; 143 } 144 145 static List<VerifyError> inference_verify(VerificationWrapper klass) { 146 return List.of(new VerifyError("Inference verification is not supported")); 147 } 148 149 static class sig_as_verification_types { 150 private int _num_args; 151 private ArrayList<VerificationType> _sig_verif_types; 152 153 sig_as_verification_types(ArrayList<VerificationType> sig_verif_types) { 154 this._sig_verif_types = sig_verif_types; 155 this._num_args = 0; 156 } 157 158 int num_args() { 159 return _num_args; 160 } 161 162 void set_num_args(int num_args) { 163 _num_args = num_args; 164 } 165 166 ArrayList<VerificationType> sig_verif_types() { 167 return _sig_verif_types; 168 } 169 } 170 171 VerificationType cp_ref_index_to_type(int index, ConstantPoolWrapper cp) { 172 return cp_index_to_type(cp.refClassIndexAt(index), cp); 173 } 174 175 final VerificationWrapper _klass; 176 final ClassHierarchyImpl _class_hierarchy; 177 VerificationWrapper.MethodWrapper _method; 178 VerificationType _this_type; 179 180 static final int BYTECODE_OFFSET = 1, NEW_OFFSET = 2; 181 182 VerificationWrapper current_class() { 183 return _klass; 184 } 185 186 ClassHierarchyImpl class_hierarchy() { 187 return _class_hierarchy; 188 } 189 190 VerificationType current_type() { 191 return _this_type; 192 } 193 194 VerificationType cp_index_to_type(int index, ConstantPoolWrapper cp) { 195 return VerificationType.reference_type(cp.classNameAt(index)); 196 } 197 198 int change_sig_to_verificationType(VerificationSignature sig_type, VerificationType inference_types[], int inference_type_index) { 199 BasicType bt = sig_type.type(); 200 switch (bt) { 201 case T_OBJECT: 202 case T_ARRAY: 203 String name = sig_type.asSymbol(); 204 inference_types[inference_type_index] = VerificationType.reference_type(name); 205 return 1; 206 case T_LONG: 207 inference_types[inference_type_index] = VerificationType.long_type; 208 inference_types[++inference_type_index] = VerificationType.long2_type; 209 return 2; 210 case T_DOUBLE: 211 inference_types[inference_type_index] = VerificationType.double_type; 212 inference_types[++inference_type_index] = VerificationType.double2_type; 213 return 2; 214 case T_INT: 215 case T_BOOLEAN: 216 case T_BYTE: 217 case T_CHAR: 218 case T_SHORT: 219 inference_types[inference_type_index] = VerificationType.integer_type; 220 return 1; 221 case T_FLOAT: 222 inference_types[inference_type_index] = VerificationType.float_type; 223 return 1; 224 default: 225 verifyError("Should not reach here"); 226 return 1; 227 } 228 } 229 230 private static final int NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION = 51; 231 private static final int STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION = 52; 232 private static final int MAX_ARRAY_DIMENSIONS = 255; 233 234 VerifierImpl(VerificationWrapper klass, ClassHierarchyResolver classHierarchyResolver, Consumer<String> logger) { 235 _klass = klass; 236 _class_hierarchy = new ClassHierarchyImpl(classHierarchyResolver); 237 _this_type = VerificationType.reference_type(klass.thisClassName()); 238 _logger = logger; 239 } 240 241 private VerificationType object_type() { 242 return VerificationType.reference_type(java_lang_Object); 243 } 244 245 List<VerifyError> verify_class() { 246 log_info("Verifying class %s with new format", _klass.thisClassName()); 247 var errors = new ArrayList<VerifyError>(); 248 for (VerificationWrapper.MethodWrapper m : _klass.methods()) { 249 if (m.isNative() || m.isAbstract() || m.isBridge()) { 250 continue; 251 } 252 verify_method(m, errors); 253 } 254 return errors; 255 } 256 257 void translate_signature(String method_sig, sig_as_verification_types sig_verif_types) { 258 var sig_stream = new VerificationSignature(method_sig, true, this); 259 VerificationType[] sig_type = new VerificationType[2]; 260 int sig_i = 0; 261 ArrayList<VerificationType> verif_types = sig_verif_types.sig_verif_types(); 262 while (!sig_stream.atReturnType()) { 263 int n = change_sig_to_verificationType(sig_stream, sig_type, 0); 264 if (n > 2) verifyError("Unexpected signature type"); 265 for (int x = 0; x < n; x++) { 266 verif_types.add(sig_type[x]); 267 } 268 sig_i += n; 269 sig_stream.next(); 270 } 271 sig_verif_types.set_num_args(sig_i); 272 if (sig_stream.type() != BasicType.T_VOID) { 273 int n = change_sig_to_verificationType(sig_stream, sig_type, 0); 274 if (n > 2) verifyError("Unexpected signature return type"); 275 for (int y = 0; y < n; y++) { 276 verif_types.add(sig_type[y]); 277 } 278 } 279 } 280 281 void create_method_sig_entry(sig_as_verification_types sig_verif_types, String method_sig) { 282 translate_signature(method_sig, sig_verif_types); 283 } 284 285 void verify_method(VerificationWrapper.MethodWrapper m, List<VerifyError> errorsCollector) { 286 try { 287 verify_method(m); 288 } catch (VerifyError err) { 289 errorsCollector.add(err); 290 } catch (Error | Exception e) { 291 errorsCollector.add(new VerifyError(e.toString())); 292 } 293 } 294 295 @SuppressWarnings("fallthrough") 296 void verify_method(VerificationWrapper.MethodWrapper m) { 297 _method = m; 298 log_info(_logger, "Verifying method %s%s", m.name(), m.descriptor()); 299 byte[] codeArray = m.codeArray(); 300 if (codeArray == null) verifyError("Missing Code attribute"); 301 int max_locals = m.maxLocals(); 302 int max_stack = m.maxStack(); 303 byte[] stackmap_data = m.stackMapTableRawData(); 304 var cp = m.constantPool(); 305 if (!VerificationSignature.isValidMethodSignature(m.descriptor())) verifyError("Invalid method signature"); 306 VerificationFrame current_frame = new VerificationFrame(max_locals, max_stack, this); 307 VerificationType return_type = current_frame.set_locals_from_arg(m, current_type()); 308 int stackmap_index = 0; 309 int code_length = m.codeLength(); 310 if (code_length < 1 || code_length > MAX_CODE_SIZE) { 311 verifyError(String.format("Invalid method Code length %d", code_length)); 312 } 313 var code = RawBytecodeHelper.of(codeArray); 314 byte[] code_data = generate_code_data(code); 315 int ex_minmax[] = new int[] {code_length, -1}; 316 verify_exception_handler_table(code_length, code_data, ex_minmax); 317 verify_local_variable_table(code_length, code_data); 318 319 var reader = new VerificationTable.StackMapReader(stackmap_data, code_data, code_length, current_frame, 320 (char) max_locals, (char) max_stack, cp, this); 321 VerificationTable stackmap_table = new VerificationTable(reader, cp, this); 322 323 var bcs = code.start(); 324 boolean no_control_flow = false; 325 int opcode; 326 while (bcs.next()) { 327 opcode = bcs.opcode(); 328 bci = bcs.bci(); 329 current_frame.set_offset(bci); 330 current_frame.set_mark(); 331 stackmap_index = verify_stackmap_table(stackmap_index, bci, current_frame, stackmap_table, no_control_flow); 332 boolean this_uninit = false; 333 boolean verified_exc_handlers = false; 334 { 335 int index; 336 int target; 337 VerificationType type, type2 = null; 338 VerificationType atype; 339 if (bcs.isWide()) { 340 if (opcode != IINC && opcode != ILOAD 341 && opcode != ALOAD && opcode != LLOAD 342 && opcode != ISTORE && opcode != ASTORE 343 && opcode != LSTORE && opcode != FLOAD 344 && opcode != DLOAD && opcode != FSTORE 345 && opcode != DSTORE) { 346 verifyError("Bad wide instruction"); 347 } 348 } 349 if (VerificationBytecodes.is_store_into_local(opcode) && bci >= ex_minmax[0] && bci < ex_minmax[1]) { 350 verify_exception_handler_targets(bci, this_uninit, current_frame, stackmap_table); 351 verified_exc_handlers = true; 352 } 353 switch (opcode) { 354 case NOP : 355 no_control_flow = false; break; 356 case ACONST_NULL : 357 current_frame.push_stack( 358 VerificationType.null_type); 359 no_control_flow = false; break; 360 case ICONST_M1 : 361 case ICONST_0 : 362 case ICONST_1 : 363 case ICONST_2 : 364 case ICONST_3 : 365 case ICONST_4 : 366 case ICONST_5 : 367 current_frame.push_stack( 368 VerificationType.integer_type); 369 no_control_flow = false; break; 370 case LCONST_0 : 371 case LCONST_1 : 372 current_frame.push_stack_2( 373 VerificationType.long_type, 374 VerificationType.long2_type); 375 no_control_flow = false; break; 376 case FCONST_0 : 377 case FCONST_1 : 378 case FCONST_2 : 379 current_frame.push_stack( 380 VerificationType.float_type); 381 no_control_flow = false; break; 382 case DCONST_0 : 383 case DCONST_1 : 384 current_frame.push_stack_2( 385 VerificationType.double_type, 386 VerificationType.double2_type); 387 no_control_flow = false; break; 388 case SIPUSH : 389 case BIPUSH : 390 current_frame.push_stack( 391 VerificationType.integer_type); 392 no_control_flow = false; break; 393 case LDC : 394 verify_ldc( 395 opcode, bcs.getIndexU1(), current_frame, 396 cp, bci); 397 no_control_flow = false; break; 398 case LDC_W : 399 case LDC2_W : 400 verify_ldc( 401 opcode, bcs.getIndexU2(), current_frame, 402 cp, bci); 403 no_control_flow = false; break; 404 case ILOAD : 405 verify_iload(bcs.getIndex(), current_frame); 406 no_control_flow = false; break; 407 case ILOAD_0 : 408 case ILOAD_1 : 409 case ILOAD_2 : 410 case ILOAD_3 : 411 index = opcode - ILOAD_0; 412 verify_iload(index, current_frame); 413 no_control_flow = false; break; 414 case LLOAD : 415 verify_lload(bcs.getIndex(), current_frame); 416 no_control_flow = false; break; 417 case LLOAD_0 : 418 case LLOAD_1 : 419 case LLOAD_2 : 420 case LLOAD_3 : 421 index = opcode - LLOAD_0; 422 verify_lload(index, current_frame); 423 no_control_flow = false; break; 424 case FLOAD : 425 verify_fload(bcs.getIndex(), current_frame); 426 no_control_flow = false; break; 427 case FLOAD_0 : 428 case FLOAD_1 : 429 case FLOAD_2 : 430 case FLOAD_3 : 431 index = opcode - FLOAD_0; 432 verify_fload(index, current_frame); 433 no_control_flow = false; break; 434 case DLOAD : 435 verify_dload(bcs.getIndex(), current_frame); 436 no_control_flow = false; break; 437 case DLOAD_0 : 438 case DLOAD_1 : 439 case DLOAD_2 : 440 case DLOAD_3 : 441 index = opcode - DLOAD_0; 442 verify_dload(index, current_frame); 443 no_control_flow = false; break; 444 case ALOAD : 445 verify_aload(bcs.getIndex(), current_frame); 446 no_control_flow = false; break; 447 case ALOAD_0 : 448 case ALOAD_1 : 449 case ALOAD_2 : 450 case ALOAD_3 : 451 index = opcode - ALOAD_0; 452 verify_aload(index, current_frame); 453 no_control_flow = false; break; 454 case IALOAD : 455 type = current_frame.pop_stack( 456 VerificationType.integer_type); 457 atype = current_frame.pop_stack( 458 VerificationType.reference_check); 459 if (!atype.is_int_array()) { 460 verifyError("Bad type"); 461 } 462 current_frame.push_stack( 463 VerificationType.integer_type); 464 no_control_flow = false; break; 465 case BALOAD : 466 type = current_frame.pop_stack( 467 VerificationType.integer_type); 468 atype = current_frame.pop_stack( 469 VerificationType.reference_check); 470 if (!atype.is_bool_array() && !atype.is_byte_array()) { 471 verifyError("Bad type"); 472 } 473 current_frame.push_stack( 474 VerificationType.integer_type); 475 no_control_flow = false; break; 476 case CALOAD : 477 type = current_frame.pop_stack( 478 VerificationType.integer_type); 479 atype = current_frame.pop_stack( 480 VerificationType.reference_check); 481 if (!atype.is_char_array()) { 482 verifyError("Bad type"); 483 } 484 current_frame.push_stack( 485 VerificationType.integer_type); 486 no_control_flow = false; break; 487 case SALOAD : 488 type = current_frame.pop_stack( 489 VerificationType.integer_type); 490 atype = current_frame.pop_stack( 491 VerificationType.reference_check); 492 if (!atype.is_short_array()) { 493 verifyError("Bad type"); 494 } 495 current_frame.push_stack( 496 VerificationType.integer_type); 497 no_control_flow = false; break; 498 case LALOAD : 499 type = current_frame.pop_stack( 500 VerificationType.integer_type); 501 atype = current_frame.pop_stack( 502 VerificationType.reference_check); 503 if (!atype.is_long_array()) { 504 verifyError("Bad type"); 505 } 506 current_frame.push_stack_2( 507 VerificationType.long_type, 508 VerificationType.long2_type); 509 no_control_flow = false; break; 510 case FALOAD : 511 type = current_frame.pop_stack( 512 VerificationType.integer_type); 513 atype = current_frame.pop_stack( 514 VerificationType.reference_check); 515 if (!atype.is_float_array()) { 516 verifyError("Bad type"); 517 } 518 current_frame.push_stack( 519 VerificationType.float_type); 520 no_control_flow = false; break; 521 case DALOAD : 522 type = current_frame.pop_stack( 523 VerificationType.integer_type); 524 atype = current_frame.pop_stack( 525 VerificationType.reference_check); 526 if (!atype.is_double_array()) { 527 verifyError("Bad type"); 528 } 529 current_frame.push_stack_2( 530 VerificationType.double_type, 531 VerificationType.double2_type); 532 no_control_flow = false; break; 533 case AALOAD : { 534 type = current_frame.pop_stack( 535 VerificationType.integer_type); 536 atype = current_frame.pop_stack( 537 VerificationType.reference_check); 538 if (!atype.is_reference_array()) { 539 verifyError("Bad type"); 540 } 541 if (atype.is_null()) { 542 current_frame.push_stack( 543 VerificationType.null_type); 544 } else { 545 VerificationType component = 546 atype.get_component(this); 547 current_frame.push_stack(component); 548 } 549 no_control_flow = false; break; 550 } 551 case ISTORE : 552 verify_istore(bcs.getIndex(), current_frame); 553 no_control_flow = false; break; 554 case ISTORE_0 : 555 case ISTORE_1 : 556 case ISTORE_2 : 557 case ISTORE_3 : 558 index = opcode - ISTORE_0; 559 verify_istore(index, current_frame); 560 no_control_flow = false; break; 561 case LSTORE : 562 verify_lstore(bcs.getIndex(), current_frame); 563 no_control_flow = false; break; 564 case LSTORE_0 : 565 case LSTORE_1 : 566 case LSTORE_2 : 567 case LSTORE_3 : 568 index = opcode - LSTORE_0; 569 verify_lstore(index, current_frame); 570 no_control_flow = false; break; 571 case FSTORE : 572 verify_fstore(bcs.getIndex(), current_frame); 573 no_control_flow = false; break; 574 case FSTORE_0 : 575 case FSTORE_1 : 576 case FSTORE_2 : 577 case FSTORE_3 : 578 index = opcode - FSTORE_0; 579 verify_fstore(index, current_frame); 580 no_control_flow = false; break; 581 case DSTORE : 582 verify_dstore(bcs.getIndex(), current_frame); 583 no_control_flow = false; break; 584 case DSTORE_0 : 585 case DSTORE_1 : 586 case DSTORE_2 : 587 case DSTORE_3 : 588 index = opcode - DSTORE_0; 589 verify_dstore(index, current_frame); 590 no_control_flow = false; break; 591 case ASTORE : 592 verify_astore(bcs.getIndex(), current_frame); 593 no_control_flow = false; break; 594 case ASTORE_0 : 595 case ASTORE_1 : 596 case ASTORE_2 : 597 case ASTORE_3 : 598 index = opcode - ASTORE_0; 599 verify_astore(index, current_frame); 600 no_control_flow = false; break; 601 case IASTORE : 602 type = current_frame.pop_stack( 603 VerificationType.integer_type); 604 type2 = current_frame.pop_stack( 605 VerificationType.integer_type); 606 atype = current_frame.pop_stack( 607 VerificationType.reference_check); 608 if (!atype.is_int_array()) { 609 verifyError("Bad type"); 610 } 611 no_control_flow = false; break; 612 case BASTORE : 613 type = current_frame.pop_stack( 614 VerificationType.integer_type); 615 type2 = current_frame.pop_stack( 616 VerificationType.integer_type); 617 atype = current_frame.pop_stack( 618 VerificationType.reference_check); 619 if (!atype.is_bool_array() && !atype.is_byte_array()) { 620 verifyError("Bad type"); 621 } 622 no_control_flow = false; break; 623 case CASTORE : 624 current_frame.pop_stack( 625 VerificationType.integer_type); 626 current_frame.pop_stack( 627 VerificationType.integer_type); 628 atype = current_frame.pop_stack( 629 VerificationType.reference_check); 630 if (!atype.is_char_array()) { 631 verifyError("Bad type"); 632 } 633 no_control_flow = false; break; 634 case SASTORE : 635 current_frame.pop_stack( 636 VerificationType.integer_type); 637 current_frame.pop_stack( 638 VerificationType.integer_type); 639 atype = current_frame.pop_stack( 640 VerificationType.reference_check); 641 if (!atype.is_short_array()) { 642 verifyError("Bad type"); 643 } 644 no_control_flow = false; break; 645 case LASTORE : 646 current_frame.pop_stack_2( 647 VerificationType.long2_type, 648 VerificationType.long_type); 649 current_frame.pop_stack( 650 VerificationType.integer_type); 651 atype = current_frame.pop_stack( 652 VerificationType.reference_check); 653 if (!atype.is_long_array()) { 654 verifyError("Bad type"); 655 } 656 no_control_flow = false; break; 657 case FASTORE : 658 current_frame.pop_stack( 659 VerificationType.float_type); 660 current_frame.pop_stack 661 (VerificationType.integer_type); 662 atype = current_frame.pop_stack( 663 VerificationType.reference_check); 664 if (!atype.is_float_array()) { 665 verifyError("Bad type"); 666 } 667 no_control_flow = false; break; 668 case DASTORE : 669 current_frame.pop_stack_2( 670 VerificationType.double2_type, 671 VerificationType.double_type); 672 current_frame.pop_stack( 673 VerificationType.integer_type); 674 atype = current_frame.pop_stack( 675 VerificationType.reference_check); 676 if (!atype.is_double_array()) { 677 verifyError("Bad type"); 678 } 679 no_control_flow = false; break; 680 case AASTORE : 681 type = current_frame.pop_stack(object_type()); 682 type2 = current_frame.pop_stack( 683 VerificationType.integer_type); 684 atype = current_frame.pop_stack( 685 VerificationType.reference_check); 686 // more type-checking is done at runtime 687 if (!atype.is_reference_array()) { 688 verifyError("Bad type"); 689 } 690 // 4938384: relaxed constraint in JVMS 3nd edition. 691 no_control_flow = false; break; 692 case POP : 693 current_frame.pop_stack( 694 VerificationType.category1_check); 695 no_control_flow = false; break; 696 case POP2 : 697 type = current_frame.pop_stack(); 698 if (type.is_category1(this)) { 699 current_frame.pop_stack( 700 VerificationType.category1_check); 701 } else if (type.is_category2_2nd()) { 702 current_frame.pop_stack( 703 VerificationType.category2_check); 704 } else { 705 verifyError("Bad type"); 706 } 707 no_control_flow = false; break; 708 case DUP : 709 type = current_frame.pop_stack( 710 VerificationType.category1_check); 711 current_frame.push_stack(type); 712 current_frame.push_stack(type); 713 no_control_flow = false; break; 714 case DUP_X1 : 715 type = current_frame.pop_stack( 716 VerificationType.category1_check); 717 type2 = current_frame.pop_stack( 718 VerificationType.category1_check); 719 current_frame.push_stack(type); 720 current_frame.push_stack(type2); 721 current_frame.push_stack(type); 722 no_control_flow = false; break; 723 case DUP_X2 : 724 { 725 VerificationType type3 = null; 726 type = current_frame.pop_stack( 727 VerificationType.category1_check); 728 type2 = current_frame.pop_stack(); 729 if (type2.is_category1(this)) { 730 type3 = current_frame.pop_stack( 731 VerificationType.category1_check); 732 } else if (type2.is_category2_2nd()) { 733 type3 = current_frame.pop_stack( 734 VerificationType.category2_check); 735 } else { 736 verifyError("Bad type"); 737 } 738 current_frame.push_stack(type); 739 current_frame.push_stack(type3); 740 current_frame.push_stack(type2); 741 current_frame.push_stack(type); 742 no_control_flow = false; break; 743 } 744 case DUP2 : 745 type = current_frame.pop_stack(); 746 if (type.is_category1(this)) { 747 type2 = current_frame.pop_stack( 748 VerificationType.category1_check); 749 } else if (type.is_category2_2nd()) { 750 type2 = current_frame.pop_stack( 751 VerificationType.category2_check); 752 } else { 753 verifyError("Bad type"); 754 } 755 current_frame.push_stack(type2); 756 current_frame.push_stack(type); 757 current_frame.push_stack(type2); 758 current_frame.push_stack(type); 759 no_control_flow = false; break; 760 case DUP2_X1 : 761 { 762 VerificationType type3; 763 type = current_frame.pop_stack(); 764 if (type.is_category1(this)) { 765 type2 = current_frame.pop_stack( 766 VerificationType.category1_check); 767 } else if (type.is_category2_2nd()) { 768 type2 = current_frame.pop_stack( 769 VerificationType.category2_check); 770 } else { 771 verifyError("Bad type"); 772 } 773 type3 = current_frame.pop_stack( 774 VerificationType.category1_check); 775 current_frame.push_stack(type2); 776 current_frame.push_stack(type); 777 current_frame.push_stack(type3); 778 current_frame.push_stack(type2); 779 current_frame.push_stack(type); 780 no_control_flow = false; break; 781 } 782 case DUP2_X2 : 783 VerificationType type3, type4 = null; 784 type = current_frame.pop_stack(); 785 if (type.is_category1(this)) { 786 type2 = current_frame.pop_stack( 787 VerificationType.category1_check); 788 } else if (type.is_category2_2nd()) { 789 type2 = current_frame.pop_stack( 790 VerificationType.category2_check); 791 } else { 792 verifyError("Bad type"); 793 } 794 type3 = current_frame.pop_stack(); 795 if (type3.is_category1(this)) { 796 type4 = current_frame.pop_stack( 797 VerificationType.category1_check); 798 } else if (type3.is_category2_2nd()) { 799 type4 = current_frame.pop_stack( 800 VerificationType.category2_check); 801 } else { 802 verifyError("Bad type"); 803 } 804 current_frame.push_stack(type2); 805 current_frame.push_stack(type); 806 current_frame.push_stack(type4); 807 current_frame.push_stack(type3); 808 current_frame.push_stack(type2); 809 current_frame.push_stack(type); 810 no_control_flow = false; break; 811 case SWAP : 812 type = current_frame.pop_stack( 813 VerificationType.category1_check); 814 type2 = current_frame.pop_stack( 815 VerificationType.category1_check); 816 current_frame.push_stack(type); 817 current_frame.push_stack(type2); 818 no_control_flow = false; break; 819 case IADD : 820 case ISUB : 821 case IMUL : 822 case IDIV : 823 case IREM : 824 case ISHL : 825 case ISHR : 826 case IUSHR : 827 case IOR : 828 case IXOR : 829 case IAND : 830 current_frame.pop_stack( 831 VerificationType.integer_type); 832 // fall through 833 case INEG : 834 current_frame.pop_stack( 835 VerificationType.integer_type); 836 current_frame.push_stack( 837 VerificationType.integer_type); 838 no_control_flow = false; break; 839 case LADD : 840 case LSUB : 841 case LMUL : 842 case LDIV : 843 case LREM : 844 case LAND : 845 case LOR : 846 case LXOR : 847 current_frame.pop_stack_2( 848 VerificationType.long2_type, 849 VerificationType.long_type); 850 // fall through 851 case LNEG : 852 current_frame.pop_stack_2( 853 VerificationType.long2_type, 854 VerificationType.long_type); 855 current_frame.push_stack_2( 856 VerificationType.long_type, 857 VerificationType.long2_type); 858 no_control_flow = false; break; 859 case LSHL : 860 case LSHR : 861 case LUSHR : 862 current_frame.pop_stack( 863 VerificationType.integer_type); 864 current_frame.pop_stack_2( 865 VerificationType.long2_type, 866 VerificationType.long_type); 867 current_frame.push_stack_2( 868 VerificationType.long_type, 869 VerificationType.long2_type); 870 no_control_flow = false; break; 871 case FADD : 872 case FSUB : 873 case FMUL : 874 case FDIV : 875 case FREM : 876 current_frame.pop_stack( 877 VerificationType.float_type); 878 // fall through 879 case FNEG : 880 current_frame.pop_stack( 881 VerificationType.float_type); 882 current_frame.push_stack( 883 VerificationType.float_type); 884 no_control_flow = false; break; 885 case DADD : 886 case DSUB : 887 case DMUL : 888 case DDIV : 889 case DREM : 890 current_frame.pop_stack_2( 891 VerificationType.double2_type, 892 VerificationType.double_type); 893 // fall through 894 case DNEG : 895 current_frame.pop_stack_2( 896 VerificationType.double2_type, 897 VerificationType.double_type); 898 current_frame.push_stack_2( 899 VerificationType.double_type, 900 VerificationType.double2_type); 901 no_control_flow = false; break; 902 case IINC : 903 verify_iinc(bcs.getIndex(), current_frame); 904 no_control_flow = false; break; 905 case I2L : 906 type = current_frame.pop_stack( 907 VerificationType.integer_type); 908 current_frame.push_stack_2( 909 VerificationType.long_type, 910 VerificationType.long2_type); 911 no_control_flow = false; break; 912 case L2I : 913 current_frame.pop_stack_2( 914 VerificationType.long2_type, 915 VerificationType.long_type); 916 current_frame.push_stack( 917 VerificationType.integer_type); 918 no_control_flow = false; break; 919 case I2F : 920 current_frame.pop_stack( 921 VerificationType.integer_type); 922 current_frame.push_stack( 923 VerificationType.float_type); 924 no_control_flow = false; break; 925 case I2D : 926 current_frame.pop_stack( 927 VerificationType.integer_type); 928 current_frame.push_stack_2( 929 VerificationType.double_type, 930 VerificationType.double2_type); 931 no_control_flow = false; break; 932 case L2F : 933 current_frame.pop_stack_2( 934 VerificationType.long2_type, 935 VerificationType.long_type); 936 current_frame.push_stack( 937 VerificationType.float_type); 938 no_control_flow = false; break; 939 case L2D : 940 current_frame.pop_stack_2( 941 VerificationType.long2_type, 942 VerificationType.long_type); 943 current_frame.push_stack_2( 944 VerificationType.double_type, 945 VerificationType.double2_type); 946 no_control_flow = false; break; 947 case F2I : 948 current_frame.pop_stack( 949 VerificationType.float_type); 950 current_frame.push_stack( 951 VerificationType.integer_type); 952 no_control_flow = false; break; 953 case F2L : 954 current_frame.pop_stack( 955 VerificationType.float_type); 956 current_frame.push_stack_2( 957 VerificationType.long_type, 958 VerificationType.long2_type); 959 no_control_flow = false; break; 960 case F2D : 961 current_frame.pop_stack( 962 VerificationType.float_type); 963 current_frame.push_stack_2( 964 VerificationType.double_type, 965 VerificationType.double2_type); 966 no_control_flow = false; break; 967 case D2I : 968 current_frame.pop_stack_2( 969 VerificationType.double2_type, 970 VerificationType.double_type); 971 current_frame.push_stack( 972 VerificationType.integer_type); 973 no_control_flow = false; break; 974 case D2L : 975 current_frame.pop_stack_2( 976 VerificationType.double2_type, 977 VerificationType.double_type); 978 current_frame.push_stack_2( 979 VerificationType.long_type, 980 VerificationType.long2_type); 981 no_control_flow = false; break; 982 case D2F : 983 current_frame.pop_stack_2( 984 VerificationType.double2_type, 985 VerificationType.double_type); 986 current_frame.push_stack( 987 VerificationType.float_type); 988 no_control_flow = false; break; 989 case I2B : 990 case I2C : 991 case I2S : 992 current_frame.pop_stack( 993 VerificationType.integer_type); 994 current_frame.push_stack( 995 VerificationType.integer_type); 996 no_control_flow = false; break; 997 case LCMP : 998 current_frame.pop_stack_2( 999 VerificationType.long2_type, 1000 VerificationType.long_type); 1001 current_frame.pop_stack_2( 1002 VerificationType.long2_type, 1003 VerificationType.long_type); 1004 current_frame.push_stack( 1005 VerificationType.integer_type); 1006 no_control_flow = false; break; 1007 case FCMPL : 1008 case FCMPG : 1009 current_frame.pop_stack( 1010 VerificationType.float_type); 1011 current_frame.pop_stack( 1012 VerificationType.float_type); 1013 current_frame.push_stack( 1014 VerificationType.integer_type); 1015 no_control_flow = false; break; 1016 case DCMPL : 1017 case DCMPG : 1018 current_frame.pop_stack_2( 1019 VerificationType.double2_type, 1020 VerificationType.double_type); 1021 current_frame.pop_stack_2( 1022 VerificationType.double2_type, 1023 VerificationType.double_type); 1024 current_frame.push_stack( 1025 VerificationType.integer_type); 1026 no_control_flow = false; break; 1027 case IF_ICMPEQ: 1028 case IF_ICMPNE: 1029 case IF_ICMPLT: 1030 case IF_ICMPGE: 1031 case IF_ICMPGT: 1032 case IF_ICMPLE: 1033 current_frame.pop_stack( 1034 VerificationType.integer_type); 1035 // fall through 1036 case IFEQ: 1037 case IFNE: 1038 case IFLT: 1039 case IFGE: 1040 case IFGT: 1041 case IFLE: 1042 current_frame.pop_stack( 1043 VerificationType.integer_type); 1044 target = bcs.dest(); 1045 stackmap_table.check_jump_target( 1046 current_frame, target); 1047 no_control_flow = false; break; 1048 case IF_ACMPEQ : 1049 case IF_ACMPNE : 1050 current_frame.pop_stack( 1051 VerificationType.reference_check); 1052 // fall through 1053 case IFNULL : 1054 case IFNONNULL : 1055 current_frame.pop_stack( 1056 VerificationType.reference_check); 1057 target = bcs.dest(); 1058 stackmap_table.check_jump_target 1059 (current_frame, target); 1060 no_control_flow = false; break; 1061 case GOTO : 1062 target = bcs.dest(); 1063 stackmap_table.check_jump_target( 1064 current_frame, target); 1065 no_control_flow = true; break; 1066 case GOTO_W : 1067 target = bcs.destW(); 1068 stackmap_table.check_jump_target( 1069 current_frame, target); 1070 no_control_flow = true; break; 1071 case TABLESWITCH : 1072 case LOOKUPSWITCH : 1073 verify_switch( 1074 bcs, code_length, code_data, current_frame, 1075 stackmap_table); 1076 no_control_flow = true; break; 1077 case IRETURN : 1078 type = current_frame.pop_stack( 1079 VerificationType.integer_type); 1080 verify_return_value(return_type, type, bci, 1081 current_frame); 1082 no_control_flow = true; break; 1083 case LRETURN : 1084 type2 = current_frame.pop_stack( 1085 VerificationType.long2_type); 1086 type = current_frame.pop_stack( 1087 VerificationType.long_type); 1088 verify_return_value(return_type, type, bci, 1089 current_frame); 1090 no_control_flow = true; break; 1091 case FRETURN : 1092 type = current_frame.pop_stack( 1093 VerificationType.float_type); 1094 verify_return_value(return_type, type, bci, 1095 current_frame); 1096 no_control_flow = true; break; 1097 case DRETURN : 1098 type2 = current_frame.pop_stack( 1099 VerificationType.double2_type); 1100 type = current_frame.pop_stack( 1101 VerificationType.double_type); 1102 verify_return_value(return_type, type, bci, 1103 current_frame); 1104 no_control_flow = true; break; 1105 case ARETURN : 1106 type = current_frame.pop_stack( 1107 VerificationType.reference_check); 1108 verify_return_value(return_type, type, bci, 1109 current_frame); 1110 no_control_flow = true; break; 1111 case RETURN: 1112 if (!return_type.is_bogus()) { 1113 verifyError("Method expects a return value"); 1114 } 1115 if (object_initializer_name.equals(_method.name()) && 1116 current_frame.flag_this_uninit()) { 1117 verifyError("Constructor must call super() or this() before return"); 1118 } 1119 no_control_flow = true; break; 1120 case GETSTATIC : 1121 case PUTSTATIC : 1122 verify_field_instructions(bcs, current_frame, cp, true); 1123 no_control_flow = false; break; 1124 case GETFIELD : 1125 case PUTFIELD : 1126 verify_field_instructions(bcs, current_frame, cp, false); 1127 no_control_flow = false; break; 1128 case INVOKEVIRTUAL : 1129 case INVOKESPECIAL : 1130 case INVOKESTATIC : 1131 this_uninit = verify_invoke_instructions(bcs, code_length, current_frame, (bci >= ex_minmax[0] && bci < ex_minmax[1]), this_uninit, return_type, cp, stackmap_table); 1132 no_control_flow = false; break; 1133 case INVOKEINTERFACE : 1134 case INVOKEDYNAMIC : 1135 this_uninit = verify_invoke_instructions(bcs, code_length, current_frame, (bci >= ex_minmax[0] && bci < ex_minmax[1]), this_uninit, return_type, cp, stackmap_table); 1136 no_control_flow = false; break; 1137 case NEW : 1138 { 1139 index = bcs.getIndexU2(); 1140 verify_cp_class_type(bci, index, cp); 1141 VerificationType new_class_type = 1142 cp_index_to_type(index, cp); 1143 if (!new_class_type.is_object()) { 1144 verifyError("Illegal new instruction"); 1145 } 1146 type = VerificationType.uninitialized_type(bci); 1147 current_frame.push_stack(type); 1148 no_control_flow = false; break; 1149 } 1150 case NEWARRAY : 1151 type = get_newarray_type(bcs.getIndex(), bci); 1152 current_frame.pop_stack( 1153 VerificationType.integer_type); 1154 current_frame.push_stack(type); 1155 no_control_flow = false; break; 1156 case ANEWARRAY : 1157 verify_anewarray(bci, bcs.getIndexU2(), cp, current_frame); 1158 no_control_flow = false; break; 1159 case ARRAYLENGTH : 1160 type = current_frame.pop_stack( 1161 VerificationType.reference_check); 1162 if (!(type.is_null() || type.is_array())) { 1163 verifyError("Bad type"); 1164 } 1165 current_frame.push_stack( 1166 VerificationType.integer_type); 1167 no_control_flow = false; break; 1168 case CHECKCAST : 1169 { 1170 index = bcs.getIndexU2(); 1171 verify_cp_class_type(bci, index, cp); 1172 current_frame.pop_stack(object_type()); 1173 VerificationType klass_type = cp_index_to_type( 1174 index, cp); 1175 current_frame.push_stack(klass_type); 1176 no_control_flow = false; break; 1177 } 1178 case INSTANCEOF : { 1179 index = bcs.getIndexU2(); 1180 verify_cp_class_type(bci, index, cp); 1181 current_frame.pop_stack(object_type()); 1182 current_frame.push_stack( 1183 VerificationType.integer_type); 1184 no_control_flow = false; break; 1185 } 1186 case MONITORENTER : 1187 case MONITOREXIT : 1188 current_frame.pop_stack( 1189 VerificationType.reference_check); 1190 no_control_flow = false; break; 1191 case MULTIANEWARRAY : 1192 { 1193 index = bcs.getIndexU2(); 1194 int dim = _method.codeArray()[bcs.bci() +3] & 0xff; 1195 verify_cp_class_type(bci, index, cp); 1196 VerificationType new_array_type = 1197 cp_index_to_type(index, cp); 1198 if (!new_array_type.is_array()) { 1199 verifyError("Illegal constant pool index in multianewarray instruction"); 1200 } 1201 if (dim < 1 || new_array_type.dimensions(this) < dim) { 1202 verifyError(String.format("Illegal dimension in multianewarray instruction: %d", dim)); 1203 } 1204 for (int i = 0; i < dim; i++) { 1205 current_frame.pop_stack( 1206 VerificationType.integer_type); 1207 } 1208 current_frame.push_stack(new_array_type); 1209 no_control_flow = false; break; 1210 } 1211 case ATHROW : 1212 type = VerificationType.reference_type(java_lang_Throwable); 1213 current_frame.pop_stack(type); 1214 no_control_flow = true; break; 1215 default: 1216 verifyError(String.format("Bad instruction: %02x", opcode)); 1217 } 1218 } 1219 if (verified_exc_handlers && this_uninit) verifyError("Exception handler targets got verified before this_uninit got set"); 1220 if (!verified_exc_handlers && bci >= ex_minmax[0] && bci < ex_minmax[1]) { 1221 verify_exception_handler_targets(bci, this_uninit, current_frame, stackmap_table); 1222 } 1223 } 1224 if (!no_control_flow) { 1225 verifyError("Control flow falls through code end"); 1226 } 1227 } 1228 1229 private byte[] generate_code_data(RawBytecodeHelper.CodeRange code) { 1230 byte[] code_data = new byte[code.length()]; 1231 var bcs = code.start(); 1232 while (bcs.next()) { 1233 if (bcs.opcode() != ILLEGAL) { 1234 int bci = bcs.bci(); 1235 if (bcs.opcode() == NEW) { 1236 code_data[bci] = NEW_OFFSET; 1237 } else { 1238 code_data[bci] = BYTECODE_OFFSET; 1239 } 1240 } else { 1241 verifyError("Bad instruction"); 1242 } 1243 } 1244 return code_data; 1245 } 1246 1247 void verify_exception_handler_table(int code_length, byte[] code_data, int[] minmax) { 1248 var cp = _method.constantPool(); 1249 for (var exhandler : _method.exceptionTable()) { 1250 int start_pc = exhandler[0]; 1251 int end_pc = exhandler[1]; 1252 int handler_pc = exhandler[2]; 1253 if (start_pc >= code_length || code_data[start_pc] == 0) { 1254 classError(String.format("Illegal exception table start_pc %d", start_pc)); 1255 } 1256 if (end_pc != code_length) { 1257 if (end_pc > code_length || code_data[end_pc] == 0) { 1258 classError(String.format("Illegal exception table end_pc %d", end_pc)); 1259 } 1260 } 1261 if (handler_pc >= code_length || code_data[handler_pc] == 0) { 1262 classError(String.format("Illegal exception table handler_pc %d", handler_pc)); 1263 } 1264 int catch_type_index = exhandler[3]; 1265 if (catch_type_index != 0) { 1266 VerificationType catch_type = cp_index_to_type(catch_type_index, cp); 1267 VerificationType throwable = VerificationType.reference_type(java_lang_Throwable); 1268 // 8267118 Not applicable here 1269 boolean is_subclass = throwable.is_assignable_from(catch_type, this); 1270 if (!is_subclass) { 1271 verifyError(String.format("Catch type is not a subclass of Throwable in exception handler %d", handler_pc)); 1272 } 1273 } 1274 if (start_pc < minmax[0]) minmax[0] = start_pc; 1275 if (end_pc > minmax[1]) minmax[1] = end_pc; 1276 } 1277 } 1278 1279 void verify_local_variable_table(int code_length, byte[] code_data) { 1280 for (var lvte : _method.localVariableTable()) { 1281 int start_bci = lvte.startPc(); 1282 int length = lvte.length(); 1283 if (start_bci >= code_length || code_data[start_bci] == 0) { 1284 classError(String.format("Illegal local variable table start_pc %d", start_bci)); 1285 } 1286 int end_bci = start_bci + length; 1287 if (end_bci != code_length) { 1288 if (end_bci >= code_length || code_data[end_bci] == 0) { 1289 classError(String.format("Illegal local variable table length %d", length)); 1290 } 1291 } 1292 } 1293 } 1294 1295 int verify_stackmap_table(int stackmap_index, int bci, VerificationFrame current_frame, VerificationTable stackmap_table, boolean no_control_flow) { 1296 if (stackmap_index < stackmap_table.get_frame_count()) { 1297 int this_offset = stackmap_table.get_offset(stackmap_index); 1298 if (no_control_flow && this_offset > bci) { 1299 verifyError("Expecting a stack map frame"); 1300 } 1301 if (this_offset == bci) { 1302 boolean matches = stackmap_table.match_stackmap(current_frame, this_offset, stackmap_index, !no_control_flow, true); 1303 if (!matches) { 1304 verifyError("Instruction type does not match stack map"); 1305 } 1306 stackmap_index++; 1307 } else if (this_offset < bci) { 1308 classError(String.format("Bad stack map offset %d", this_offset)); 1309 } 1310 } else if (no_control_flow) { 1311 verifyError("Expecting a stack map frame"); 1312 } 1313 return stackmap_index; 1314 } 1315 1316 void verify_exception_handler_targets(int bci, boolean this_uninit, VerificationFrame current_frame, VerificationTable stackmap_table) { 1317 var cp = _method.constantPool(); 1318 for(var exhandler : _method.exceptionTable()) { 1319 int start_pc = exhandler[0]; 1320 int end_pc = exhandler[1]; 1321 int handler_pc = exhandler[2]; 1322 int catch_type_index = exhandler[3]; 1323 if(bci >= start_pc && bci < end_pc) { 1324 int flags = current_frame.flags(); 1325 if (this_uninit) { flags |= FLAG_THIS_UNINIT; } 1326 VerificationFrame new_frame = current_frame.frame_in_exception_handler(flags); 1327 if (catch_type_index != 0) { 1328 VerificationType catch_type = cp_index_to_type(catch_type_index, cp); 1329 new_frame.push_stack(catch_type); 1330 } else { 1331 VerificationType throwable = VerificationType.reference_type(java_lang_Throwable); 1332 new_frame.push_stack(throwable); 1333 } 1334 boolean matches = stackmap_table.match_stackmap(new_frame, handler_pc, true, false); 1335 if (!matches) { 1336 verifyError(String.format("Stack map does not match the one at exception handler %d", handler_pc)); 1337 } 1338 } 1339 } 1340 } 1341 1342 void verify_cp_index(int bci, ConstantPoolWrapper cp, int index) { 1343 int nconstants = cp.entryCount(); 1344 if ((index <= 0) || (index >= nconstants)) { 1345 verifyError(String.format("Illegal constant pool index %d", index)); 1346 } 1347 } 1348 1349 void verify_cp_type(int bci, int index, ConstantPoolWrapper cp, int types) { 1350 verify_cp_index(bci, cp, index); 1351 int tag = cp.tagAt(index); 1352 if (tag > JVM_CONSTANT_ExternalMax || (types & (1 << tag))== 0) { 1353 verifyError(String.format("Illegal type at constant pool entry %d", index)); 1354 } 1355 } 1356 1357 void verify_cp_class_type(int bci, int index, ConstantPoolWrapper cp) { 1358 verify_cp_index(bci, cp, index); 1359 int tag = cp.tagAt(index); 1360 if (tag != JVM_CONSTANT_Class) { 1361 verifyError(String.format("Illegal type at constant pool entry %d", index)); 1362 } 1363 } 1364 1365 void verify_ldc(int opcode, int index, VerificationFrame current_frame, ConstantPoolWrapper cp, int bci) { 1366 verify_cp_index(bci, cp, index); 1367 int tag = cp.tagAt(index); 1368 int types = 0; 1369 if (opcode == LDC || opcode == LDC_W) { 1370 types = (1 << JVM_CONSTANT_Integer) | (1 << JVM_CONSTANT_Float) 1371 | (1 << JVM_CONSTANT_String) | (1 << JVM_CONSTANT_Class) 1372 | (1 << JVM_CONSTANT_MethodHandle) | (1 << JVM_CONSTANT_MethodType) 1373 | (1 << JVM_CONSTANT_Dynamic); 1374 verify_cp_type(bci, index, cp, types); 1375 } else { 1376 if (opcode != LDC2_W) verifyError("must be ldc2_w"); 1377 types = (1 << JVM_CONSTANT_Double) | (1 << JVM_CONSTANT_Long) | (1 << JVM_CONSTANT_Dynamic); 1378 verify_cp_type(bci, index, cp, types); 1379 } 1380 switch (tag) { 1381 case JVM_CONSTANT_Utf8 -> current_frame.push_stack(object_type()); 1382 case JVM_CONSTANT_String -> current_frame.push_stack(VerificationType.reference_type(java_lang_String)); 1383 case JVM_CONSTANT_Class -> current_frame.push_stack(VerificationType.reference_type(java_lang_Class)); 1384 case JVM_CONSTANT_Integer -> current_frame.push_stack(VerificationType.integer_type); 1385 case JVM_CONSTANT_Float -> current_frame.push_stack(VerificationType.float_type); 1386 case JVM_CONSTANT_Double -> current_frame.push_stack_2(VerificationType.double_type, VerificationType.double2_type); 1387 case JVM_CONSTANT_Long -> current_frame.push_stack_2(VerificationType.long_type, VerificationType.long2_type); 1388 case JVM_CONSTANT_MethodHandle -> current_frame.push_stack(VerificationType.reference_type(java_lang_invoke_MethodHandle)); 1389 case JVM_CONSTANT_MethodType -> current_frame.push_stack(VerificationType.reference_type(java_lang_invoke_MethodType)); 1390 case JVM_CONSTANT_Dynamic -> { 1391 String constant_type = cp.dynamicConstantSignatureAt(index); 1392 if (!VerificationSignature.isValidTypeSignature(constant_type)) verifyError("Invalid type for dynamic constant"); 1393 VerificationType[] v_constant_type = new VerificationType[2]; 1394 var sig_stream = new VerificationSignature(constant_type, false, this); 1395 int n = change_sig_to_verificationType(sig_stream, v_constant_type, 0); 1396 int opcode_n = (opcode == LDC2_W ? 2 : 1); 1397 if (n != opcode_n) { 1398 types &= ~(1 << JVM_CONSTANT_Dynamic); 1399 verify_cp_type(bci, index, cp, types); 1400 } 1401 for (int i = 0; i < n; i++) { 1402 current_frame.push_stack(v_constant_type[i]); 1403 } 1404 } 1405 default -> verifyError("Invalid index in ldc"); 1406 } 1407 } 1408 1409 void verify_switch(RawBytecodeHelper bcs, int code_length, byte[] code_data, VerificationFrame current_frame, VerificationTable stackmap_table) { 1410 int bci = bcs.bci(); 1411 int aligned_bci = VerificationBytecodes.align(bci + 1); 1412 // 4639449 & 4647081: padding bytes must be 0 1413 if (_klass.majorVersion() < NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION) { 1414 int padding_offset = 1; 1415 while ((bci + padding_offset) < aligned_bci) { 1416 if (_method.codeArray()[bci + padding_offset] != 0) { 1417 verifyError("Nonzero padding byte in lookupswitch or tableswitch"); 1418 } 1419 padding_offset++; 1420 } 1421 } 1422 int default_offset = bcs.getIntUnchecked(aligned_bci); 1423 int keys, delta; 1424 current_frame.pop_stack(VerificationType.integer_type); 1425 if (bcs.opcode() == TABLESWITCH) { 1426 int low = bcs.getIntUnchecked(aligned_bci + 4); 1427 int high = bcs.getIntUnchecked(aligned_bci + 2*4); 1428 if (low > high) { 1429 verifyError("low must be less than or equal to high in tableswitch"); 1430 } 1431 long keys64 = ((long) high - low) + 1; 1432 if (keys64 > 65535) { // Max code length 1433 verifyError("too many keys in tableswitch"); 1434 } 1435 keys = (int) keys64; 1436 delta = 1; 1437 } else { 1438 // Make sure that the lookupswitch items are sorted 1439 keys = bcs.getIntUnchecked(aligned_bci + 4); 1440 if (keys < 0) { 1441 verifyError("number of keys in lookupswitch less than 0"); 1442 } 1443 delta = 2; 1444 for (int i = 0; i < (keys - 1); i++) { 1445 int this_key = bcs.getIntUnchecked(aligned_bci + (2+2*i)*4); 1446 int next_key = bcs.getIntUnchecked(aligned_bci + (2+2*i+2)*4); 1447 if (this_key >= next_key) { 1448 verifyError("Bad lookupswitch instruction"); 1449 } 1450 } 1451 } 1452 int target = bci + default_offset; 1453 stackmap_table.check_jump_target(current_frame, target); 1454 for (int i = 0; i < keys; i++) { 1455 aligned_bci = VerificationBytecodes.align(bcs.bci() + 1); 1456 target = bci + bcs.getIntUnchecked(aligned_bci + (3+i*delta)*4); 1457 stackmap_table.check_jump_target(current_frame, target); 1458 } 1459 } 1460 1461 void verify_field_instructions(RawBytecodeHelper bcs, VerificationFrame current_frame, ConstantPoolWrapper cp, boolean allow_arrays) { 1462 int index = bcs.getIndexU2(); 1463 verify_cp_type(bcs.bci(), index, cp, 1 << JVM_CONSTANT_Fieldref); 1464 String field_name = cp.refNameAt(index); 1465 String field_sig = cp.refSignatureAt(index); 1466 if (!VerificationSignature.isValidTypeSignature(field_sig)) verifyError("Invalid field signature"); 1467 VerificationType ref_class_type = cp_ref_index_to_type(index, cp); 1468 if (!ref_class_type.is_object() && 1469 (!allow_arrays || !ref_class_type.is_array())) { 1470 verifyError(String.format("Expecting reference to class in class %s at constant pool index %d", _klass.thisClassName(), index)); 1471 } 1472 VerificationType target_class_type = ref_class_type; 1473 VerificationType[] field_type = new VerificationType[2]; 1474 var sig_stream = new VerificationSignature(field_sig, false, this); 1475 VerificationType stack_object_type = null; 1476 int n = change_sig_to_verificationType(sig_stream, field_type, 0); 1477 boolean is_assignable; 1478 switch (bcs.opcode()) { 1479 case GETSTATIC -> { 1480 for (int i = 0; i < n; i++) { 1481 current_frame.push_stack(field_type[i]); 1482 } 1483 } 1484 case PUTSTATIC -> { 1485 for (int i = n - 1; i >= 0; i--) { 1486 current_frame.pop_stack(field_type[i]); 1487 } 1488 } 1489 case GETFIELD -> { 1490 stack_object_type = current_frame.pop_stack( 1491 target_class_type); 1492 // 8270398 Not applicable here 1493 for (int i = 0; i < n; i++) { 1494 current_frame.push_stack(field_type[i]); 1495 } 1496 } 1497 case PUTFIELD -> { 1498 for (int i = n - 1; i >= 0; i--) { 1499 current_frame.pop_stack(field_type[i]); 1500 } 1501 stack_object_type = current_frame.pop_stack(); 1502 if (stack_object_type.is_uninitialized_this(this) && 1503 target_class_type.equals(current_type()) && 1504 _klass.findField(field_name, field_sig)) { 1505 stack_object_type = current_type(); 1506 } 1507 is_assignable = target_class_type.is_assignable_from(stack_object_type, this); 1508 if (!is_assignable) { 1509 verifyError("Bad type on operand stack in putfield"); 1510 } 1511 } 1512 default -> verifyError("Should not reach here"); 1513 } 1514 } 1515 1516 // Return TRUE if all code paths starting with start_bc_offset end in 1517 // bytecode athrow or loop. 1518 boolean ends_in_athrow(int start_bc_offset) { 1519 log_info("unimplemented VerifierImpl.ends_in_athrow"); 1520 return true; 1521 } 1522 1523 boolean verify_invoke_init(RawBytecodeHelper bcs, int ref_class_index, VerificationType ref_class_type, 1524 VerificationFrame current_frame, int code_length, boolean in_try_block, 1525 boolean this_uninit, ConstantPoolWrapper cp, VerificationTable stackmap_table) { 1526 int bci = bcs.bci(); 1527 VerificationType type = current_frame.pop_stack(VerificationType.reference_check); 1528 if (type.is_uninitialized_this(this)) { 1529 String superk_name = current_class().superclassName(); 1530 if (!current_class().thisClassName().equals(ref_class_type.name()) && 1531 !superk_name.equals(ref_class_type.name())) { 1532 verifyError("Bad <init> method call"); 1533 } 1534 if (in_try_block) { 1535 for(var exhandler : _method.exceptionTable()) { 1536 int start_pc = exhandler[0]; 1537 int end_pc = exhandler[1]; 1538 1539 if (bci >= start_pc && bci < end_pc) { 1540 if (!ends_in_athrow(exhandler[2])) { 1541 verifyError("Bad <init> method call from after the start of a try block"); 1542 } 1543 } 1544 } 1545 verify_exception_handler_targets(bci, true, current_frame, stackmap_table); 1546 } 1547 current_frame.initialize_object(type, current_type()); 1548 this_uninit = true; 1549 } else if (type.is_uninitialized()) { 1550 int new_offset = type.bci(this); 1551 if (new_offset > (code_length - 3) || (_method.codeArray()[new_offset] & 0xff) != NEW) { 1552 verifyError("Expecting new instruction"); 1553 } 1554 int new_class_index = bcs.getU2(new_offset + 1); 1555 verify_cp_class_type(bci, new_class_index, cp); 1556 VerificationType new_class_type = cp_index_to_type( 1557 new_class_index, cp); 1558 if (!new_class_type.equals(ref_class_type)) { 1559 verifyError("Call to wrong <init> method"); 1560 } 1561 if (in_try_block) { 1562 verify_exception_handler_targets(bci, this_uninit, current_frame, 1563 stackmap_table); 1564 } 1565 current_frame.initialize_object(type, new_class_type); 1566 } else { 1567 verifyError("Bad operand type when invoking <init>"); 1568 } 1569 return this_uninit; 1570 } 1571 1572 static boolean is_same_or_direct_interface(VerificationWrapper klass, VerificationType klass_type, VerificationType ref_class_type) { 1573 if (ref_class_type.equals(klass_type)) return true; 1574 for (String k_name : klass.interfaceNames()) { 1575 if (ref_class_type.equals(VerificationType.reference_type(k_name))) { 1576 return true; 1577 } 1578 } 1579 return false; 1580 } 1581 1582 boolean verify_invoke_instructions(RawBytecodeHelper bcs, int code_length, VerificationFrame current_frame, boolean in_try_block, boolean this_uninit, VerificationType return_type, ConstantPoolWrapper cp, VerificationTable stackmap_table) { 1583 // Make sure the constant pool item is the right type 1584 int index = bcs.getIndexU2(); 1585 int opcode = bcs.opcode(); 1586 int types = 0; 1587 switch (opcode) { 1588 case INVOKEINTERFACE: 1589 types = 1 << JVM_CONSTANT_InterfaceMethodref; 1590 break; 1591 case INVOKEDYNAMIC: 1592 types = 1 << JVM_CONSTANT_InvokeDynamic; 1593 break; 1594 case INVOKESPECIAL: 1595 case INVOKESTATIC: 1596 types = (_klass.majorVersion() < STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION) ? 1597 (1 << JVM_CONSTANT_Methodref) : 1598 ((1 << JVM_CONSTANT_InterfaceMethodref) | (1 << JVM_CONSTANT_Methodref)); 1599 break; 1600 default: 1601 types = 1 << JVM_CONSTANT_Methodref; 1602 } 1603 verify_cp_type(bcs.bci(), index, cp, types); 1604 String method_name = cp.refNameAt(index); 1605 String method_sig = cp.refSignatureAt(index); 1606 if (!VerificationSignature.isValidMethodSignature(method_sig)) verifyError("Invalid method signature"); 1607 VerificationType ref_class_type = null; 1608 if (opcode == INVOKEDYNAMIC) { 1609 if (_klass.majorVersion() < INVOKEDYNAMIC_MAJOR_VERSION) { 1610 classError(String.format("invokedynamic instructions not supported by this class file version (%d), class %s", _klass.majorVersion(), _klass.thisClassName())); 1611 } 1612 } else { 1613 ref_class_type = cp_ref_index_to_type(index, cp); 1614 } 1615 String sig = cp.refSignatureAt(index); 1616 sig_as_verification_types mth_sig_verif_types; 1617 ArrayList<VerificationType> verif_types = new ArrayList<>(10); 1618 mth_sig_verif_types = new sig_as_verification_types(verif_types); 1619 create_method_sig_entry(mth_sig_verif_types, sig); 1620 int nargs = mth_sig_verif_types.num_args(); 1621 int bci = bcs.bci(); 1622 if (opcode == INVOKEINTERFACE) { 1623 if ((_method.codeArray()[bci+3] & 0xff) != (nargs+1)) { 1624 verifyError("Inconsistent args count operand in invokeinterface"); 1625 } 1626 if ((_method.codeArray()[bci+4] & 0xff) != 0) { 1627 verifyError("Fourth operand byte of invokeinterface must be zero"); 1628 } 1629 } 1630 if (opcode == INVOKEDYNAMIC) { 1631 if ((_method.codeArray()[bci+3] & 0xff) != 0 || (_method.codeArray()[bci+4] & 0xff) != 0) { 1632 verifyError("Third and fourth operand bytes of invokedynamic must be zero"); 1633 } 1634 } 1635 if (method_name.charAt(0) == JVM_SIGNATURE_SPECIAL) { 1636 if (opcode != INVOKESPECIAL || 1637 !object_initializer_name.equals(method_name)) { 1638 verifyError("Illegal call to internal method"); 1639 } 1640 } else if (opcode == INVOKESPECIAL 1641 && !is_same_or_direct_interface(current_class(), current_type(), ref_class_type) 1642 && !ref_class_type.equals(VerificationType.reference_type( 1643 current_class().superclassName()))) { 1644 1645 // We know it is not current class, direct superinterface or immediate superclass. That means it 1646 // could be: 1647 // - a totally unrelated class or interface 1648 // - an indirect superinterface 1649 // - an indirect superclass (including Object) 1650 // We use the assignability test to see if it is a superclass, or else an interface, and keep track 1651 // of the latter. Note that subtype can be true if we are dealing with an interface that is not actually 1652 // implemented as assignability treats all interfaces as Object. 1653 1654 boolean[] is_interface = {false}; // This can only be set true if the assignability check will return true 1655 // and we loaded the class. For any other "true" returns (e.g. same class 1656 // or Object) we either can't get here (same class already excluded above) 1657 // or we know it is not an interface (i.e. Object). 1658 boolean subtype = ref_class_type.is_reference_assignable_from(current_type(), this, is_interface); 1659 if (!subtype) { // Totally unrelated class 1660 verifyError("Bad invokespecial instruction: current class isn't assignable to reference class."); 1661 } else { 1662 // Indirect superclass (including Object), indirect interface, or unrelated interface. 1663 // Any interface use is an error. 1664 if (is_interface[0]) { 1665 verifyError("Bad invokespecial instruction: interface method to invoke is not in a direct superinterface."); 1666 } 1667 } 1668 1669 } 1670 ArrayList<VerificationType> sig_verif_types = mth_sig_verif_types.sig_verif_types(); 1671 if (sig_verif_types == null) verifyError("Missing signature's array of verification types"); 1672 for (int i = nargs - 1; i >= 0; i--) { // Run backwards 1673 current_frame.pop_stack(sig_verif_types.get(i)); 1674 } 1675 if (opcode != INVOKESTATIC && 1676 opcode != INVOKEDYNAMIC) { 1677 if (object_initializer_name.equals(method_name)) { // <init> method 1678 this_uninit = verify_invoke_init(bcs, index, ref_class_type, current_frame, 1679 code_length, in_try_block, this_uninit, cp, stackmap_table); 1680 } else { 1681 switch (opcode) { 1682 case INVOKESPECIAL -> 1683 current_frame.pop_stack(current_type()); 1684 case INVOKEVIRTUAL -> { 1685 VerificationType stack_object_type = 1686 current_frame.pop_stack(ref_class_type); 1687 if (current_type() != stack_object_type) { 1688 cp.classNameAt(cp.refClassIndexAt(index)); 1689 } 1690 } 1691 default -> { 1692 if (opcode != INVOKEINTERFACE) 1693 verifyError("Unexpected opcode encountered"); 1694 current_frame.pop_stack(ref_class_type); 1695 } 1696 } 1697 } 1698 } 1699 int sig_verif_types_len = sig_verif_types.size(); 1700 if (sig_verif_types_len > nargs) { // There's a return type 1701 if (object_initializer_name.equals(method_name)) { 1702 verifyError("Return type must be void in <init> method"); 1703 } 1704 1705 if (sig_verif_types_len > nargs + 2) verifyError("Signature verification types array return type is bogus"); 1706 for (int i = nargs; i < sig_verif_types_len; i++) { 1707 if (!(i == nargs || sig_verif_types.get(i).is_long2() || sig_verif_types.get(i).is_double2())) verifyError("Unexpected return verificationType"); 1708 current_frame.push_stack(sig_verif_types.get(i)); 1709 } 1710 } 1711 return this_uninit; 1712 } 1713 1714 VerificationType get_newarray_type(int index, int bci) { 1715 String[] from_bt = new String[] { 1716 null, null, null, null, "[Z", "[C", "[F", "[D", "[B", "[S", "[I", "[J", 1717 }; 1718 if (index < T_BOOLEAN.type || index > T_LONG.type) { 1719 verifyError("Illegal newarray instruction"); 1720 } 1721 String sig = from_bt[index]; 1722 return VerificationType.reference_type(sig); 1723 } 1724 1725 void verify_anewarray(int bci, int index, ConstantPoolWrapper cp, VerificationFrame current_frame) { 1726 verify_cp_class_type(bci, index, cp); 1727 current_frame.pop_stack(VerificationType.integer_type); 1728 VerificationType component_type = cp_index_to_type(index, cp); 1729 int length; 1730 String arr_sig_str; 1731 if (component_type.is_array()) { // it's an array 1732 String component_name = component_type.name(); 1733 length = component_name.length(); 1734 if (length > MAX_ARRAY_DIMENSIONS && 1735 component_name.charAt(MAX_ARRAY_DIMENSIONS - 1) == JVM_SIGNATURE_ARRAY) { 1736 verifyError("Illegal anewarray instruction, array has more than 255 dimensions"); 1737 } 1738 length++; 1739 arr_sig_str = String.format("%c%s", JVM_SIGNATURE_ARRAY, component_name); 1740 if (arr_sig_str.length() != length) verifyError("Unexpected number of characters in string"); 1741 } else { // it's an object or interface 1742 String component_name = component_type.name(); 1743 length = component_name.length() + 3; 1744 arr_sig_str = String.format("%c%c%s;", JVM_SIGNATURE_ARRAY, JVM_SIGNATURE_CLASS, component_name); 1745 if (arr_sig_str.length() != length) verifyError("Unexpected number of characters in string"); 1746 } 1747 VerificationType new_array_type = VerificationType.reference_type(arr_sig_str); 1748 current_frame.push_stack(new_array_type); 1749 } 1750 1751 void verify_iload(int index, VerificationFrame current_frame) { 1752 current_frame.get_local( 1753 index, VerificationType.integer_type); 1754 current_frame.push_stack( 1755 VerificationType.integer_type); 1756 } 1757 1758 void verify_lload(int index, VerificationFrame current_frame) { 1759 current_frame.get_local_2( 1760 index, VerificationType.long_type, 1761 VerificationType.long2_type); 1762 current_frame.push_stack_2( 1763 VerificationType.long_type, 1764 VerificationType.long2_type); 1765 } 1766 1767 void verify_fload(int index, VerificationFrame current_frame) { 1768 current_frame.get_local( 1769 index, VerificationType.float_type); 1770 current_frame.push_stack( 1771 VerificationType.float_type); 1772 } 1773 1774 void verify_dload(int index, VerificationFrame current_frame) { 1775 current_frame.get_local_2( 1776 index, VerificationType.double_type, 1777 VerificationType.double2_type); 1778 current_frame.push_stack_2( 1779 VerificationType.double_type, 1780 VerificationType.double2_type); 1781 } 1782 1783 void verify_aload(int index, VerificationFrame current_frame) { 1784 VerificationType type = current_frame.get_local( 1785 index, VerificationType.reference_check); 1786 current_frame.push_stack(type); 1787 } 1788 1789 void verify_istore(int index, VerificationFrame current_frame) { 1790 current_frame.pop_stack( 1791 VerificationType.integer_type); 1792 current_frame.set_local( 1793 index, VerificationType.integer_type); 1794 } 1795 1796 void verify_lstore(int index, VerificationFrame current_frame) { 1797 current_frame.pop_stack_2( 1798 VerificationType.long2_type, 1799 VerificationType.long_type); 1800 current_frame.set_local_2( 1801 index, VerificationType.long_type, 1802 VerificationType.long2_type); 1803 } 1804 1805 void verify_fstore(int index, VerificationFrame current_frame) { 1806 current_frame.pop_stack( 1807 VerificationType.float_type); 1808 current_frame.set_local( 1809 index, VerificationType.float_type); 1810 } 1811 1812 void verify_dstore(int index, VerificationFrame current_frame) { 1813 current_frame.pop_stack_2( 1814 VerificationType.double2_type, 1815 VerificationType.double_type); 1816 current_frame.set_local_2( 1817 index, VerificationType.double_type, 1818 VerificationType.double2_type); 1819 } 1820 1821 void verify_astore(int index, VerificationFrame current_frame) { 1822 VerificationType type = current_frame.pop_stack( 1823 VerificationType.reference_check); 1824 current_frame.set_local(index, type); 1825 } 1826 1827 void verify_iinc(int index, VerificationFrame current_frame) { 1828 VerificationType type = current_frame.get_local( 1829 index, VerificationType.integer_type); 1830 current_frame.set_local(index, type); 1831 } 1832 1833 void verify_return_value(VerificationType return_type, VerificationType type, int bci, VerificationFrame current_frame) { 1834 if (return_type.is_bogus()) { 1835 verifyError("Method does not expect a return value"); 1836 } 1837 boolean match = return_type.is_assignable_from(type, this); 1838 if (!match) { 1839 verifyError("Bad return type"); 1840 } 1841 } 1842 1843 private void dumpMethod() { 1844 if (_logger != null) ClassPrinter.toTree(_method.m, ClassPrinter.Verbosity.CRITICAL_ATTRIBUTES).toYaml(_logger); 1845 } 1846 1847 void verifyError(String msg) { 1848 dumpMethod(); 1849 throw new VerifyError(String.format("%s in %s::%s(%s) @%d %s", msg, _klass.thisClassName(), _method.name(), _method.parameters(), bci, errorContext).trim()); 1850 } 1851 1852 void verifyError(String msg, VerificationFrame from, VerificationFrame target) { 1853 dumpMethod(); 1854 throw new VerifyError(String.format("%s in %s::%s(%s) @%d %s%n while assigning %s%n to %s", msg, _klass.thisClassName(), _method.name(), _method.parameters(), bci, errorContext, from, target)); 1855 } 1856 1857 void classError(String msg) { 1858 dumpMethod(); 1859 throw new VerifyError(String.format("%s in %s::%s(%s)", msg, _klass.thisClassName(), _method.name(), _method.parameters())); 1860 } 1861 }