]> granicus.if.org Git - gc/commitdiff
Add assertion that no hb_n_marks underflow occurs
authorIvan Maidanski <ivmai@mail.ru>
Sat, 19 Aug 2017 15:46:59 +0000 (18:46 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 28 Sep 2017 08:18:19 +0000 (11:18 +0300)
Issue #177 (bdwgc).

* alloc.c (GC_clear_fl_marks): Add GC_ASSERT that hhdr->hb_n_marks
is non-zero before decrementing it.
* mark.c (GC_clear_mark_bit): Likewise.

alloc.c
mark.c

diff --git a/alloc.c b/alloc.c
index e69558f115e6b4c2575626933901a9b7d9009459..799ee2947a6e3165cad7ff54a7ec8b161c1dd591 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -388,7 +388,7 @@ STATIC void GC_maybe_gc(void)
         }
         /* We try to mark with the world stopped.       */
         /* If we run out of time, this turns into       */
-        /* incremental marking.                 */
+        /* incremental marking.                         */
 #       ifndef NO_CLOCK
           if (GC_time_limit != GC_TIME_UNLIMITED) { GET_TIME(GC_start_time); }
 #       endif
@@ -851,8 +851,11 @@ STATIC void GC_clear_fl_marks(ptr_t q)
         unsigned bit_no = MARK_BIT_NO((ptr_t)q - (ptr_t)h, sz);
 
         if (mark_bit_from_hdr(hhdr, bit_no)) {
-          size_t n_marks = hhdr -> hb_n_marks - 1;
+          size_t n_marks = hhdr -> hb_n_marks;
+
+          GC_ASSERT(n_marks != 0);
           clear_mark_bit_from_hdr(hhdr, bit_no);
+          n_marks--;
 #         ifdef PARALLEL_MARK
             /* Appr. count, don't decrement to zero! */
             if (0 != n_marks || !GC_parallel) {
diff --git a/mark.c b/mark.c
index 0c48e0a88bf51355d86a9d2cce7669219d4a5e2f..60088852d98ed4d21f2bddd86e98d5f0400249d8 100644 (file)
--- a/mark.c
+++ b/mark.c
@@ -203,9 +203,11 @@ GC_API void GC_CALL GC_clear_mark_bit(const void *p)
     word bit_no = MARK_BIT_NO((ptr_t)p - (ptr_t)h, hhdr -> hb_sz);
 
     if (mark_bit_from_hdr(hhdr, bit_no)) {
-      size_t n_marks;
+      size_t n_marks = hhdr -> hb_n_marks;
+
+      GC_ASSERT(n_marks != 0);
       clear_mark_bit_from_hdr(hhdr, bit_no);
-      n_marks = hhdr -> hb_n_marks - 1;
+      n_marks--;
 #     ifdef PARALLEL_MARK
         if (n_marks != 0 || !GC_parallel)
           hhdr -> hb_n_marks = n_marks;