summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-03-16 07:13:22 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-03-16 11:07:58 +0300
commitaeebfc0852485d5bcac9643185145dde613e49de (patch)
tree0a191baa6814992a886bbb1f6475afd859bdd3e7 /finalize.c
parent673f0cf3f25ad914bd273d50d9973f9dc92ff801 (diff)
downloadbdwgc-aeebfc0852485d5bcac9643185145dde613e49de.tar.gz
Assert that disappearing links are accessible during registration and GC
* finalize.c [GC_ASSERTIONS] (GC_register_disappearing_link_inner): Pass *link to GC_noop1(). * finalize.c [!GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED && GC_ASSERTIONS] (GC_move_disappearing_link_inner): Pass *new_link to GC_noop1(). * finalize.c [GC_ASSERTIONS] (GC_make_disappearing_links_disappear): Dereference revealed curr_dl->dl_hidden_link (and pass the value to GC_noop1); add comment.
Diffstat (limited to 'finalize.c')
-rw-r--r--finalize.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/finalize.c b/finalize.c
index 8782cd21..9308959c 100644
--- a/finalize.c
+++ b/finalize.c
@@ -168,6 +168,9 @@ STATIC int GC_register_disappearing_link_inner(
DCL_LOCK_STATE;
if (EXPECT(GC_find_leak, FALSE)) return GC_UNIMPLEMENTED;
+# ifdef GC_ASSERTIONS
+ GC_noop1((word)(*link)); /* check accessibility */
+# endif
LOCK();
GC_ASSERT(obj != NULL && GC_base_C(obj) == obj);
if (EXPECT(NULL == dl_hashtbl -> head, FALSE)
@@ -520,6 +523,9 @@ GC_API GC_await_finalize_proc GC_CALL GC_get_await_finalize_proc(void)
size_t curr_index, new_index;
word curr_hidden_link, new_hidden_link;
+# ifdef GC_ASSERTIONS
+ GC_noop1((word)(*new_link));
+# endif
GC_ASSERT(I_HOLD_LOCK());
if (EXPECT(NULL == dl_hashtbl -> head, FALSE)) return GC_NOT_FOUND;
@@ -931,6 +937,10 @@ GC_INLINE void GC_make_disappearing_links_disappear(
for (curr_dl = dl_hashtbl->head[i]; curr_dl != NULL; curr_dl = next_dl) {
next_dl = dl_next(curr_dl);
+# ifdef GC_ASSERTIONS
+ /* Check accessibility of the location pointed by link. */
+ GC_noop1(*(word *)GC_REVEAL_POINTER(curr_dl->dl_hidden_link));
+# endif
if (is_remove_dangling) {
ptr_t real_link = (ptr_t)GC_base(GC_REVEAL_POINTER(
curr_dl->dl_hidden_link));