]> 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>
Sat, 19 Aug 2017 15:46:59 +0000 (18:46 +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 b038940e1231f30b6fd32ce1ab847939b1ea8fb1..c492f015a99c12f1f9d51c4adbceb9c98614eb59 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -393,7 +393,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
@@ -855,8 +855,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 0fba5b81360e1cc05d581e62b78e498b35c64c6c..f438d52e800d9e336df99a1f73e775e47225f696 100644 (file)
--- a/mark.c
+++ b/mark.c
@@ -206,9 +206,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;