From 8e1f3a0e5162a223e77c2af8dd7f8d1b32c68653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Fri, 22 May 2015 16:52:13 +0200 Subject: [PATCH] VM: after reset_datastack and retainstack clear the stack segment. makes it easier to find bad accesses to shadow data --- vm/contexts.cpp | 10 ++++++++++ vm/contexts.hpp | 1 + vm/slot_visitor.hpp | 20 ++++++++------------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/vm/contexts.cpp b/vm/contexts.cpp index df698b38e8..e829bfd4b2 100644 --- a/vm/contexts.cpp +++ b/vm/contexts.cpp @@ -17,10 +17,12 @@ context::context(cell datastack_size, cell retainstack_size, void context::reset_datastack() { datastack = datastack_seg->start - sizeof(cell); + fill_stack_seg(datastack, datastack_seg, 0x11111111); } void context::reset_retainstack() { retainstack = retainstack_seg->start - sizeof(cell); + fill_stack_seg(retainstack, retainstack_seg, 0x22222222); } void context::reset_callstack() { @@ -32,6 +34,14 @@ void context::reset_context_objects() { context_object_count * sizeof(cell)); } +void context::fill_stack_seg(cell top_ptr, segment* seg, cell pattern) { +#ifdef FACTOR_DEBUG + cell clear_start = top_ptr + sizeof(cell); + cell clear_size = seg->end - clear_start; + memset_cell((void*)clear_start, pattern, clear_size); +#endif +} + void context::reset() { reset_datastack(); reset_retainstack(); diff --git a/vm/contexts.hpp b/vm/contexts.hpp index b898d78c0b..b9e04fe302 100644 --- a/vm/contexts.hpp +++ b/vm/contexts.hpp @@ -48,6 +48,7 @@ struct context { void reset_context_objects(); void reset(); void fix_stacks(); + void fill_stack_seg(cell top_ptr, segment* seg, cell pattern); cell peek() { return *(cell*)datastack; } diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index 6db92c592e..7bd7a1c7ea 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -381,23 +381,19 @@ void slot_visitor::visit_context(context* ctx) { stacks. */ visit_callstack(ctx); - cell* ds_ptr = (cell*)ctx->datastack; - cell* rs_ptr = (cell*)ctx->retainstack; - visit_stack_elements(ctx->datastack_seg, ds_ptr); - visit_stack_elements(ctx->retainstack_seg, rs_ptr); + cell ds_ptr = ctx->datastack; + cell rs_ptr = ctx->retainstack; + segment* ds_seg = ctx->datastack_seg; + segment* rs_seg = ctx->retainstack_seg; + visit_stack_elements(ds_seg, (cell*)ds_ptr); + visit_stack_elements(rs_seg, (cell*)rs_ptr); visit_object_array(ctx->context_objects, ctx->context_objects + context_object_count); /* Clear out the space not visited with a known pattern. That makes it easier to see if uninitialized reads are made. */ - #ifdef FACTOR_DEBUG - cell ds_clear_start = (cell)(ds_ptr + 1); - cell ds_clear_size = ctx->datastack_seg->end - ds_clear_start; - memset_cell((void*)ds_clear_start, 0xbaadbaad, ds_clear_size); - cell rs_clear_start = (cell)(rs_ptr + 1); - cell rs_clear_size = ctx->retainstack_seg->end - rs_clear_start; - memset_cell((void*)rs_clear_start, 0xdaabdaab, rs_clear_size); - #endif + ctx->fill_stack_seg(ds_ptr, ds_seg, 0xbaadbadd); + ctx->fill_stack_seg(rs_ptr, rs_seg, 0xdaabdaab); } template void slot_visitor::visit_contexts() {