[前][次][番号順一覧][スレッド一覧]

ruby-changes:71054

From: Peter <ko1@a...>
Date: Mon, 31 Jan 2022 23:42:43 +0900 (JST)
Subject: [ruby-changes:71054] 605f226142 (master): Fix heap page iteration in gc_verify_heap_page

https://git.ruby-lang.org/ruby.git/commit/?id=605f226142

From 605f226142a47c4f9e4cc88717c5d6170bc3d7f1 Mon Sep 17 00:00:00 2001
From: Peter Zhu <peter@p...>
Date: Fri, 28 Jan 2022 09:43:46 -0500
Subject: Fix heap page iteration in gc_verify_heap_page

The for loops are not correctly iterating heap pages in
gc_verify_heap_page.
---
 gc.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/gc.c b/gc.c
index 2c11b07d41d..b06ebac446b 100644
--- a/gc.c
+++ b/gc.c
@@ -7653,16 +7653,18 @@ verify_internal_consistency_i(void *page_start, void *page_end, size_t stride, https://github.com/ruby/ruby/blob/trunk/gc.c#L7653
 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) https://github.com/ruby/ruby/blob/trunk/gc.c#L7687
     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));
 	    }
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]