summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2022-01-28 09:43:46 -0500
committerPeter Zhu <peter@peterzhu.ca>2022-01-31 09:42:20 -0500
commit605f226142a47c4f9e4cc88717c5d6170bc3d7f1 (patch)
tree8c6871e4c9441edd4c4bce324ceef354c489a2a2 /gc.c
parentb01657c4707eadd9de9573ce9818d0b5f0fe3047 (diff)
Fix heap page iteration in gc_verify_heap_page
The for loops are not correctly iterating heap pages in gc_verify_heap_page.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5503
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/gc.c b/gc.c
index 2c11b07d41..b06ebac446 100644
--- a/gc.c
+++ b/gc.c
@@ -7653,16 +7653,18 @@ verify_internal_consistency_i(void *page_start, void *page_end, size_t stride,
static int
gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj)
{
- int i;
unsigned int has_remembered_shady = FALSE;
unsigned int has_remembered_old = FALSE;
int remembered_old_objects = 0;
int free_objects = 0;
int zombie_objects = 0;
- int stride = page->slot_size / sizeof(RVALUE);
- for (i=0; i<page->total_slots; i+=stride) {
- VALUE val = (VALUE)&page->start[i];
+ short slot_size = page->slot_size;
+ uintptr_t start = (uintptr_t)page->start;
+ uintptr_t end = start + page->total_slots * slot_size;
+
+ for (uintptr_t ptr = start; ptr < end; ptr += slot_size) {
+ VALUE val = (VALUE)ptr;
void *poisoned = asan_poisoned_object_p(val);
asan_unpoison_object(val, false);
@@ -7685,8 +7687,8 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj)
if (!is_incremental_marking(objspace) &&
page->flags.has_remembered_objects == FALSE && has_remembered_old == TRUE) {
- for (i=0; i<page->total_slots; i++) {
- VALUE val = (VALUE)&page->start[i];
+ for (uintptr_t ptr = start; ptr < end; ptr += slot_size) {
+ VALUE val = (VALUE)ptr;
if (RVALUE_PAGE_MARKING(page, val)) {
fprintf(stderr, "marking -> %s\n", obj_info(val));
}