From a2829904d02c5fb13b8441f93952c7925bbd0d9c Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 28 Jul 2021 16:46:42 -0700 Subject: [PATCH] Add assertions for bad backtrace locations --- vm_backtrace.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/vm_backtrace.c b/vm_backtrace.c index 670f73d2a2..0cb829b7ef 100644 --- a/vm_backtrace.c +++ b/vm_backtrace.c @@ -191,12 +191,13 @@ location_lineno(rb_backtrace_location_t *loc) return calc_lineno(loc->body.iseq.iseq, loc->body.iseq.pc); case LOCATION_TYPE_CFUNC: if (loc->body.cfunc.prev_loc) { - return location_lineno(loc->body.cfunc.prev_loc); - } - return 0; + VM_ASSERT(loc->body.cfunc.prev_loc != loc); + return location_lineno(loc->body.cfunc.prev_loc); + } + return 0; default: - rb_bug("location_lineno: unreachable"); - UNREACHABLE; + rb_bug("location_lineno: unreachable"); + UNREACHABLE; } } @@ -294,6 +295,7 @@ location_path(rb_backtrace_location_t *loc) return rb_iseq_path(loc->body.iseq.iseq); case LOCATION_TYPE_CFUNC: if (loc->body.cfunc.prev_loc) { + VM_ASSERT(loc->body.cfunc.prev_loc != loc); return location_path(loc->body.cfunc.prev_loc); } return Qnil; @@ -358,6 +360,7 @@ location_realpath(rb_backtrace_location_t *loc) return rb_iseq_realpath(loc->body.iseq.iseq); case LOCATION_TYPE_CFUNC: if (loc->body.cfunc.prev_loc) { + VM_ASSERT(loc->body.cfunc.prev_loc != loc); return location_realpath(loc->body.cfunc.prev_loc); } return Qnil; @@ -411,6 +414,7 @@ location_to_str(rb_backtrace_location_t *loc) break; case LOCATION_TYPE_CFUNC: if (loc->body.cfunc.prev_loc) { + VM_ASSERT(loc->body.cfunc.prev_loc != loc); file = rb_iseq_path(loc->body.cfunc.prev_loc->body.iseq.iseq); lineno = location_lineno(loc->body.cfunc.prev_loc); } @@ -764,6 +768,7 @@ bt_iter_cfunc(void *ptr, const rb_control_frame_t *cfp, ID mid) loc->type = LOCATION_TYPE_CFUNC; loc->body.cfunc.mid = mid; if (arg->prev_loc) { + VM_ASSERT(loc != arg->prev_loc); loc->body.cfunc.prev_loc = arg->prev_loc; } else if (arg->prev_cfp) { @@ -772,6 +777,7 @@ bt_iter_cfunc(void *ptr, const rb_control_frame_t *cfp, ID mid) arg->init_loc->type = LOCATION_TYPE_ISEQ; arg->init_loc->body.iseq.iseq = iseq; arg->init_loc->body.iseq.pc = pc; + VM_ASSERT(loc != arg->init_loc); loc->body.cfunc.prev_loc = arg->prev_loc = arg->init_loc; } else { -- 2.32.0