< prev index next > src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp
Print this page
/*
- * Copyright (c) 2017, 2021, Red Hat, Inc. All rights reserved.
+ * 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
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);
- Klass* obj_klass = ShenandoahForwarding::klass(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, 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(),
} 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 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()) {
- Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset());
+ const Metadata* klass = fwd->metadata_field(java_lang_Class::klass_offset());
check(ShenandoahAsserts::_safe_oop, obj,
klass == nullptr || Metaspace::contains(klass),
- "Instance class mirror should point to Metaspace");
+ "Mirrored instance class should point to Metaspace");
- Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset());
+ 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),
- "Array class mirror should point to Metaspace");
+ "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 >