8337213: Shenandoah: Add verification for class mirrors

Reviewed-by: rkennke, wkemper
This commit is contained in:
Aleksey Shipilev 2024-07-30 08:29:23 +00:00
parent 9e6e0a8f34
commit 156f0b4332
2 changed files with 34 additions and 0 deletions
src/hotspot/share/gc/shenandoah

@ -250,6 +250,25 @@ void ShenandoahAsserts::assert_correct(void* interior_loc, oop obj, const char*
file, line);
}
}
// 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 (java_lang_Class::is_instance(obj)) {
Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset());
if (klass != nullptr && !Metaspace::contains(klass)) {
print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
"Instance class mirror should point to Metaspace",
file, line);
}
Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset());
if (array_klass != nullptr && !Metaspace::contains(array_klass)) {
print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
"Array class mirror should point to Metaspace",
file, line);
}
}
}
void ShenandoahAsserts::assert_in_correct_region(void* interior_loc, oop obj, const char* file, int line) {

@ -212,6 +212,21 @@ private:
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 (java_lang_Class::is_instance(obj)) {
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) {