23 */
24
25 #ifndef SHARE_CLASSFILE_VERIFIER_HPP
26 #define SHARE_CLASSFILE_VERIFIER_HPP
27
28 #include "classfile/verificationType.hpp"
29 #include "oops/klass.hpp"
30 #include "oops/method.hpp"
31 #include "runtime/handles.hpp"
32 #include "utilities/exceptions.hpp"
33 #include "utilities/growableArray.hpp"
34 #include "utilities/resourceHash.hpp"
35
36 // The verifier class
37 class Verifier : AllStatic {
38 public:
39 enum {
40 STACKMAP_ATTRIBUTE_MAJOR_VERSION = 50,
41 INVOKEDYNAMIC_MAJOR_VERSION = 51,
42 NO_RELAX_ACCESS_CTRL_CHECK_VERSION = 52,
43 DYNAMICCONSTANT_MAJOR_VERSION = 55
44 };
45
46 // Verify the bytecodes for a class.
47 static bool verify(InstanceKlass* klass, bool should_verify_class, TRAPS);
48
49 static void log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name,
50 oop pending_exception);
51
52 // Return false if the class is loaded by the bootstrap loader,
53 // or if defineClass was called requesting skipping verification
54 // -Xverify:all overrides this value
55 static bool should_verify_for(oop class_loader, bool should_verify_class);
56
57 // Relax certain access checks to enable some broken 1.1 apps to run on 1.2.
58 static bool relax_access_for(oop class_loader);
59
60 // Print output for class+resolve
61 static void trace_class_resolution(Klass* resolve_class, InstanceKlass* verify_class);
62
63 private:
138
139 #ifdef ASSERT
140 void print_on(outputStream* str) const;
141 #endif
142 };
143
144 class ErrorContext {
145 private:
146 typedef enum {
147 INVALID_BYTECODE, // There was a problem with the bytecode
148 WRONG_TYPE, // Type value was not as expected
149 FLAGS_MISMATCH, // Frame flags are not assignable
150 BAD_CP_INDEX, // Invalid constant pool index
151 BAD_LOCAL_INDEX, // Invalid local index
152 LOCALS_SIZE_MISMATCH, // Frames have differing local counts
153 STACK_SIZE_MISMATCH, // Frames have different stack sizes
154 STACK_OVERFLOW, // Attempt to push onto a full expression stack
155 STACK_UNDERFLOW, // Attempt to pop and empty expression stack
156 MISSING_STACKMAP, // No stackmap for this location and there should be
157 BAD_STACKMAP, // Format error in stackmap
158 NO_FAULT, // No error
159 UNKNOWN
160 } FaultType;
161
162 int _bci;
163 FaultType _fault;
164 TypeOrigin _type;
165 TypeOrigin _expected;
166
167 ErrorContext(int bci, FaultType fault) :
168 _bci(bci), _fault(fault) {}
169 ErrorContext(int bci, FaultType fault, TypeOrigin type) :
170 _bci(bci), _fault(fault), _type(type) {}
171 ErrorContext(int bci, FaultType fault, TypeOrigin type, TypeOrigin exp) :
172 _bci(bci), _fault(fault), _type(type), _expected(exp) {}
173
174 public:
175 ErrorContext() : _bci(-1), _fault(NO_FAULT) {}
176
177 static ErrorContext bad_code(int bci) {
201 return ErrorContext(bci, LOCALS_SIZE_MISMATCH,
202 TypeOrigin::frame(frame0), TypeOrigin::frame(frame1));
203 }
204 static ErrorContext stack_size_mismatch(
205 int bci, StackMapFrame* frame0, StackMapFrame* frame1) {
206 return ErrorContext(bci, STACK_SIZE_MISMATCH,
207 TypeOrigin::frame(frame0), TypeOrigin::frame(frame1));
208 }
209 static ErrorContext stack_overflow(int bci, StackMapFrame* frame) {
210 return ErrorContext(bci, STACK_OVERFLOW, TypeOrigin::frame(frame));
211 }
212 static ErrorContext stack_underflow(int bci, StackMapFrame* frame) {
213 return ErrorContext(bci, STACK_UNDERFLOW, TypeOrigin::frame(frame));
214 }
215 static ErrorContext missing_stackmap(int bci) {
216 return ErrorContext(bci, MISSING_STACKMAP);
217 }
218 static ErrorContext bad_stackmap(int index, StackMapFrame* frame) {
219 return ErrorContext(0, BAD_STACKMAP, TypeOrigin::frame(frame));
220 }
221
222 bool is_valid() const { return _fault != NO_FAULT; }
223 int bci() const { return _bci; }
224
225 void reset_frames() {
226 _type.reset_frame();
227 _expected.reset_frame();
228 }
229
230 void details(outputStream* ss, const Method* method) const;
231
232 #ifdef ASSERT
233 void print_on(outputStream* str) const {
234 str->print("error_context(%d, %d,", _bci, _fault);
235 _type.print_on(str);
236 str->print(",");
237 _expected.print_on(str);
238 str->print(")");
239 }
240 #endif
331
332 void verify_invoke_init(
333 RawBytecodeStream* bcs, u2 ref_index, VerificationType ref_class_type,
334 StackMapFrame* current_frame, u4 code_length, bool in_try_block,
335 bool* this_uninit, const constantPoolHandle& cp, StackMapTable* stackmap_table,
336 TRAPS);
337
338 // Used by ends_in_athrow() to push all handlers that contain bci onto the
339 // handler_stack, if the handler has not already been pushed on the stack.
340 void push_handlers(ExceptionTable* exhandlers,
341 GrowableArray<u4>* handler_list,
342 GrowableArray<u4>* handler_stack,
343 u4 bci);
344
345 // Returns true if all paths starting with start_bc_offset end in athrow
346 // bytecode or loop.
347 bool ends_in_athrow(u4 start_bc_offset);
348
349 void verify_invoke_instructions(
350 RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame,
351 bool in_try_block, bool* this_uninit, VerificationType return_type,
352 const constantPoolHandle& cp, StackMapTable* stackmap_table, TRAPS);
353
354 VerificationType get_newarray_type(u2 index, int bci, TRAPS);
355 void verify_anewarray(int bci, u2 index, const constantPoolHandle& cp,
356 StackMapFrame* current_frame, TRAPS);
357 void verify_return_value(
358 VerificationType return_type, VerificationType type, int bci,
359 StackMapFrame* current_frame, TRAPS);
360
361 void verify_iload (int index, StackMapFrame* current_frame, TRAPS);
362 void verify_lload (int index, StackMapFrame* current_frame, TRAPS);
363 void verify_fload (int index, StackMapFrame* current_frame, TRAPS);
364 void verify_dload (int index, StackMapFrame* current_frame, TRAPS);
365 void verify_aload (int index, StackMapFrame* current_frame, TRAPS);
366 void verify_istore(int index, StackMapFrame* current_frame, TRAPS);
367 void verify_lstore(int index, StackMapFrame* current_frame, TRAPS);
368 void verify_fstore(int index, StackMapFrame* current_frame, TRAPS);
369 void verify_dstore(int index, StackMapFrame* current_frame, TRAPS);
370 void verify_astore(int index, StackMapFrame* current_frame, TRAPS);
371 void verify_iinc (int index, StackMapFrame* current_frame, TRAPS);
428 ss.print("%s", _message);
429 _error_context.details(&ss, _method());
430 return ss.as_string();
431 }
432
433 // Called when verify or class format errors are encountered.
434 // May throw an exception based upon the mode.
435 void verify_error(ErrorContext ctx, const char* fmt, ...) ATTRIBUTE_PRINTF(3, 4);
436 void class_format_error(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3);
437
438 Klass* load_class(Symbol* name, TRAPS);
439
440 method_signatures_table_type* method_signatures_table() {
441 return &_method_signatures_table;
442 }
443
444 int change_sig_to_verificationType(
445 SignatureStream* sig_type, VerificationType* inference_type);
446
447 VerificationType cp_index_to_type(int index, const constantPoolHandle& cp, TRAPS) {
448 return VerificationType::reference_type(cp->klass_name_at(index));
449 }
450
451 // Keep a list of temporary symbols created during verification because
452 // their reference counts need to be decremented when the verifier object
453 // goes out of scope. Since these symbols escape the scope in which they're
454 // created, we can't use a TempNewSymbol.
455 Symbol* create_temporary_symbol(const char *s, int length);
456 Symbol* create_temporary_symbol(Symbol* s) {
457 if (s == _previous_symbol) {
458 return s;
459 }
460 if (!s->is_permanent()) {
461 s->increment_refcount();
462 if (_symbols == nullptr) {
463 _symbols = new GrowableArray<Symbol*>(50, 0, nullptr);
464 }
465 _symbols->push(s);
466 }
467 _previous_symbol = s;
468 return s;
469 }
470
471 TypeOrigin ref_ctx(const char* str);
472
473 };
474
475 inline int ClassVerifier::change_sig_to_verificationType(
476 SignatureStream* sig_type, VerificationType* inference_type) {
477 BasicType bt = sig_type->type();
478 switch (bt) {
479 case T_OBJECT:
480 case T_ARRAY:
481 {
482 Symbol* name = sig_type->as_symbol();
483 // Create another symbol to save as signature stream unreferences this symbol.
484 Symbol* name_copy = create_temporary_symbol(name);
485 assert(name_copy == name, "symbols don't match");
486 *inference_type =
487 VerificationType::reference_type(name_copy);
488 return 1;
489 }
490 case T_LONG:
491 *inference_type = VerificationType::long_type();
492 *++inference_type = VerificationType::long2_type();
493 return 2;
494 case T_DOUBLE:
495 *inference_type = VerificationType::double_type();
496 *++inference_type = VerificationType::double2_type();
497 return 2;
498 case T_INT:
499 case T_BOOLEAN:
500 case T_BYTE:
501 case T_CHAR:
502 case T_SHORT:
503 *inference_type = VerificationType::integer_type();
504 return 1;
505 case T_FLOAT:
506 *inference_type = VerificationType::float_type();
507 return 1;
|
23 */
24
25 #ifndef SHARE_CLASSFILE_VERIFIER_HPP
26 #define SHARE_CLASSFILE_VERIFIER_HPP
27
28 #include "classfile/verificationType.hpp"
29 #include "oops/klass.hpp"
30 #include "oops/method.hpp"
31 #include "runtime/handles.hpp"
32 #include "utilities/exceptions.hpp"
33 #include "utilities/growableArray.hpp"
34 #include "utilities/resourceHash.hpp"
35
36 // The verifier class
37 class Verifier : AllStatic {
38 public:
39 enum {
40 STACKMAP_ATTRIBUTE_MAJOR_VERSION = 50,
41 INVOKEDYNAMIC_MAJOR_VERSION = 51,
42 NO_RELAX_ACCESS_CTRL_CHECK_VERSION = 52,
43 DYNAMICCONSTANT_MAJOR_VERSION = 55,
44 VALUE_TYPES_MAJOR_VERSION = 67,
45 JAVA_PREVIEW_MINOR_VERSION = 65535,
46 };
47
48 // Verify the bytecodes for a class.
49 static bool verify(InstanceKlass* klass, bool should_verify_class, TRAPS);
50
51 static void log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name,
52 oop pending_exception);
53
54 // Return false if the class is loaded by the bootstrap loader,
55 // or if defineClass was called requesting skipping verification
56 // -Xverify:all overrides this value
57 static bool should_verify_for(oop class_loader, bool should_verify_class);
58
59 // Relax certain access checks to enable some broken 1.1 apps to run on 1.2.
60 static bool relax_access_for(oop class_loader);
61
62 // Print output for class+resolve
63 static void trace_class_resolution(Klass* resolve_class, InstanceKlass* verify_class);
64
65 private:
140
141 #ifdef ASSERT
142 void print_on(outputStream* str) const;
143 #endif
144 };
145
146 class ErrorContext {
147 private:
148 typedef enum {
149 INVALID_BYTECODE, // There was a problem with the bytecode
150 WRONG_TYPE, // Type value was not as expected
151 FLAGS_MISMATCH, // Frame flags are not assignable
152 BAD_CP_INDEX, // Invalid constant pool index
153 BAD_LOCAL_INDEX, // Invalid local index
154 LOCALS_SIZE_MISMATCH, // Frames have differing local counts
155 STACK_SIZE_MISMATCH, // Frames have different stack sizes
156 STACK_OVERFLOW, // Attempt to push onto a full expression stack
157 STACK_UNDERFLOW, // Attempt to pop and empty expression stack
158 MISSING_STACKMAP, // No stackmap for this location and there should be
159 BAD_STACKMAP, // Format error in stackmap
160 WRONG_INLINE_TYPE, // Mismatched inline type
161 NO_FAULT, // No error
162 UNKNOWN
163 } FaultType;
164
165 int _bci;
166 FaultType _fault;
167 TypeOrigin _type;
168 TypeOrigin _expected;
169
170 ErrorContext(int bci, FaultType fault) :
171 _bci(bci), _fault(fault) {}
172 ErrorContext(int bci, FaultType fault, TypeOrigin type) :
173 _bci(bci), _fault(fault), _type(type) {}
174 ErrorContext(int bci, FaultType fault, TypeOrigin type, TypeOrigin exp) :
175 _bci(bci), _fault(fault), _type(type), _expected(exp) {}
176
177 public:
178 ErrorContext() : _bci(-1), _fault(NO_FAULT) {}
179
180 static ErrorContext bad_code(int bci) {
204 return ErrorContext(bci, LOCALS_SIZE_MISMATCH,
205 TypeOrigin::frame(frame0), TypeOrigin::frame(frame1));
206 }
207 static ErrorContext stack_size_mismatch(
208 int bci, StackMapFrame* frame0, StackMapFrame* frame1) {
209 return ErrorContext(bci, STACK_SIZE_MISMATCH,
210 TypeOrigin::frame(frame0), TypeOrigin::frame(frame1));
211 }
212 static ErrorContext stack_overflow(int bci, StackMapFrame* frame) {
213 return ErrorContext(bci, STACK_OVERFLOW, TypeOrigin::frame(frame));
214 }
215 static ErrorContext stack_underflow(int bci, StackMapFrame* frame) {
216 return ErrorContext(bci, STACK_UNDERFLOW, TypeOrigin::frame(frame));
217 }
218 static ErrorContext missing_stackmap(int bci) {
219 return ErrorContext(bci, MISSING_STACKMAP);
220 }
221 static ErrorContext bad_stackmap(int index, StackMapFrame* frame) {
222 return ErrorContext(0, BAD_STACKMAP, TypeOrigin::frame(frame));
223 }
224 static ErrorContext bad_inline_type(int bci, TypeOrigin type, TypeOrigin exp) {
225 return ErrorContext(bci, WRONG_INLINE_TYPE, type, exp);
226 }
227
228 bool is_valid() const { return _fault != NO_FAULT; }
229 int bci() const { return _bci; }
230
231 void reset_frames() {
232 _type.reset_frame();
233 _expected.reset_frame();
234 }
235
236 void details(outputStream* ss, const Method* method) const;
237
238 #ifdef ASSERT
239 void print_on(outputStream* str) const {
240 str->print("error_context(%d, %d,", _bci, _fault);
241 _type.print_on(str);
242 str->print(",");
243 _expected.print_on(str);
244 str->print(")");
245 }
246 #endif
337
338 void verify_invoke_init(
339 RawBytecodeStream* bcs, u2 ref_index, VerificationType ref_class_type,
340 StackMapFrame* current_frame, u4 code_length, bool in_try_block,
341 bool* this_uninit, const constantPoolHandle& cp, StackMapTable* stackmap_table,
342 TRAPS);
343
344 // Used by ends_in_athrow() to push all handlers that contain bci onto the
345 // handler_stack, if the handler has not already been pushed on the stack.
346 void push_handlers(ExceptionTable* exhandlers,
347 GrowableArray<u4>* handler_list,
348 GrowableArray<u4>* handler_stack,
349 u4 bci);
350
351 // Returns true if all paths starting with start_bc_offset end in athrow
352 // bytecode or loop.
353 bool ends_in_athrow(u4 start_bc_offset);
354
355 void verify_invoke_instructions(
356 RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame,
357 bool in_try_block, bool* this_uninit,
358 const constantPoolHandle& cp, StackMapTable* stackmap_table, TRAPS);
359
360 VerificationType get_newarray_type(u2 index, int bci, TRAPS);
361 void verify_anewarray(int bci, u2 index, const constantPoolHandle& cp,
362 StackMapFrame* current_frame, TRAPS);
363 void verify_return_value(
364 VerificationType return_type, VerificationType type, int bci,
365 StackMapFrame* current_frame, TRAPS);
366
367 void verify_iload (int index, StackMapFrame* current_frame, TRAPS);
368 void verify_lload (int index, StackMapFrame* current_frame, TRAPS);
369 void verify_fload (int index, StackMapFrame* current_frame, TRAPS);
370 void verify_dload (int index, StackMapFrame* current_frame, TRAPS);
371 void verify_aload (int index, StackMapFrame* current_frame, TRAPS);
372 void verify_istore(int index, StackMapFrame* current_frame, TRAPS);
373 void verify_lstore(int index, StackMapFrame* current_frame, TRAPS);
374 void verify_fstore(int index, StackMapFrame* current_frame, TRAPS);
375 void verify_dstore(int index, StackMapFrame* current_frame, TRAPS);
376 void verify_astore(int index, StackMapFrame* current_frame, TRAPS);
377 void verify_iinc (int index, StackMapFrame* current_frame, TRAPS);
434 ss.print("%s", _message);
435 _error_context.details(&ss, _method());
436 return ss.as_string();
437 }
438
439 // Called when verify or class format errors are encountered.
440 // May throw an exception based upon the mode.
441 void verify_error(ErrorContext ctx, const char* fmt, ...) ATTRIBUTE_PRINTF(3, 4);
442 void class_format_error(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3);
443
444 Klass* load_class(Symbol* name, TRAPS);
445
446 method_signatures_table_type* method_signatures_table() {
447 return &_method_signatures_table;
448 }
449
450 int change_sig_to_verificationType(
451 SignatureStream* sig_type, VerificationType* inference_type);
452
453 VerificationType cp_index_to_type(int index, const constantPoolHandle& cp, TRAPS) {
454 Symbol* name = cp->klass_name_at(index);
455 return VerificationType::reference_type(name);
456 }
457
458 // Keep a list of temporary symbols created during verification because
459 // their reference counts need to be decremented when the verifier object
460 // goes out of scope. Since these symbols escape the scope in which they're
461 // created, we can't use a TempNewSymbol.
462 Symbol* create_temporary_symbol(const char *s, int length);
463 Symbol* create_temporary_symbol(Symbol* s) {
464 if (s == _previous_symbol) {
465 return s;
466 }
467 if (!s->is_permanent()) {
468 s->increment_refcount();
469 if (_symbols == nullptr) {
470 _symbols = new GrowableArray<Symbol*>(50, 0, nullptr);
471 }
472 _symbols->push(s);
473 }
474 _previous_symbol = s;
475 return s;
476 }
477
478 TypeOrigin ref_ctx(const char* str);
479
480 };
481
482 inline int ClassVerifier::change_sig_to_verificationType(
483 SignatureStream* sig_type, VerificationType* inference_type) {
484 BasicType bt = sig_type->type();
485 switch (bt) {
486 case T_OBJECT:
487 case T_ARRAY:
488 {
489 Symbol* name = sig_type->as_symbol();
490 // Create another symbol to save as signature stream unreferences this symbol.
491 Symbol* name_copy = create_temporary_symbol(name);
492 assert(name_copy == name, "symbols don't match");
493 *inference_type = VerificationType::reference_type(name_copy);
494 return 1;
495 }
496 case T_LONG:
497 *inference_type = VerificationType::long_type();
498 *++inference_type = VerificationType::long2_type();
499 return 2;
500 case T_DOUBLE:
501 *inference_type = VerificationType::double_type();
502 *++inference_type = VerificationType::double2_type();
503 return 2;
504 case T_INT:
505 case T_BOOLEAN:
506 case T_BYTE:
507 case T_CHAR:
508 case T_SHORT:
509 *inference_type = VerificationType::integer_type();
510 return 1;
511 case T_FLOAT:
512 *inference_type = VerificationType::float_type();
513 return 1;
|