< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp

Print this page
*** 1,7 ***
  /*
!  * Copyright (c) 2017, 2021, Red Hat, Inc. All rights reserved.
   * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
   * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
--- 1,7 ---
  /*
!  * Copyright (c) 2017, 2025, Red Hat, Inc. All rights reserved.
   * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
   * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it

*** 147,19 ***
  
      check(ShenandoahAsserts::_safe_unknown, obj, _heap->is_in_reserved(obj),
                "oop must be in heap bounds");
      check(ShenandoahAsserts::_safe_unknown, obj, is_object_aligned(obj),
                "oop must be aligned");
  
      ShenandoahHeapRegion *obj_reg = _heap->heap_region_containing(obj);
!     Klass* obj_klass = ShenandoahForwarding::klass(obj);
  
      // Verify that obj is not in dead space:
      {
        // Do this before touching obj->size()
-       check(ShenandoahAsserts::_safe_unknown, obj, obj_klass != nullptr,
-              "Object klass pointer should not be null");
        check(ShenandoahAsserts::_safe_unknown, obj, Metaspace::contains(obj_klass),
               "Object klass pointer must go to metaspace");
  
        HeapWord *obj_addr = cast_from_oop<HeapWord*>(obj);
        check(ShenandoahAsserts::_safe_unknown, obj, obj_addr < obj_reg->top(),
--- 147,25 ---
  
      check(ShenandoahAsserts::_safe_unknown, obj, _heap->is_in_reserved(obj),
                "oop must be in heap bounds");
      check(ShenandoahAsserts::_safe_unknown, obj, is_object_aligned(obj),
                "oop must be aligned");
+     check(ShenandoahAsserts::_safe_unknown, obj, os::is_readable_pointer(obj),
+               "oop must be accessible");
  
      ShenandoahHeapRegion *obj_reg = _heap->heap_region_containing(obj);
! 
+     narrowKlass nk = 0;
+     const Klass* obj_klass = nullptr;
+     const bool klass_valid = ShenandoahAsserts::extract_klass_safely(obj, nk, obj_klass);
+ 
+     check(ShenandoahAsserts::_safe_unknown, obj, klass_valid,
+            "Object klass pointer unreadable or invalid");
  
      // Verify that obj is not in dead space:
      {
        // Do this before touching obj->size()
        check(ShenandoahAsserts::_safe_unknown, obj, Metaspace::contains(obj_klass),
               "Object klass pointer must go to metaspace");
  
        HeapWord *obj_addr = cast_from_oop<HeapWord*>(obj);
        check(ShenandoahAsserts::_safe_unknown, obj, obj_addr < obj_reg->top(),

*** 242,22 ***
      } else {
        fwd_reg = obj_reg;
      }
  
      // Do additional checks for special objects: their fields can hold metadata as well.
!     // We want to check class loading/unloading did not corrupt them.
  
      if (obj_klass == vmClasses::Class_klass()) {
!       Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset());
        check(ShenandoahAsserts::_safe_oop, obj,
              klass == nullptr || Metaspace::contains(klass),
!             "Instance class mirror should point to Metaspace");
  
!       Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset());
        check(ShenandoahAsserts::_safe_oop, obj,
              array_klass == nullptr || Metaspace::contains(array_klass),
!             "Array class mirror should point to Metaspace");
      }
  
      // ------------ obj and fwd are safe at this point --------------
      switch (_options._verify_marked) {
        case ShenandoahVerifier::_verify_marked_disable:
--- 248,24 ---
      } else {
        fwd_reg = obj_reg;
      }
  
      // Do additional checks for special objects: their fields can hold metadata as well.
!     // We want to check class loading/unloading did not corrupt them. We can only reasonably
+     // trust the forwarded objects, as the from-space object can have the klasses effectively
+     // dead.
  
      if (obj_klass == vmClasses::Class_klass()) {
!       const Metadata* klass = fwd->metadata_field(java_lang_Class::klass_offset());
        check(ShenandoahAsserts::_safe_oop, obj,
              klass == nullptr || Metaspace::contains(klass),
!             "Mirrored instance class should point to Metaspace");
  
!       const Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset());
        check(ShenandoahAsserts::_safe_oop, obj,
              array_klass == nullptr || Metaspace::contains(array_klass),
!             "Mirrored array class should point to Metaspace");
      }
  
      // ------------ obj and fwd are safe at this point --------------
      switch (_options._verify_marked) {
        case ShenandoahVerifier::_verify_marked_disable:
< prev index next >