diff options
author | Maria Matejka <mq@ucw.cz> | 2023-02-02 13:26:49 +0100 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2023-02-02 15:57:21 +0100 |
commit | 226839c97731394b98cc8c7421a152964061c1aa (patch) | |
tree | 68858a391dc7674109158ff52a0f68f594c4fb2d | |
parent | c354e8f4c199ca7dec441394156d18badac71b81 (diff) |
Lists: fixed bugs in expensive checks in quirky usecases
-rw-r--r-- | lib/lists.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/lists.c b/lib/lists.c index 200576cf..2f32a5e1 100644 --- a/lib/lists.c +++ b/lib/lists.c @@ -37,9 +37,10 @@ check_list(list *l, node *n) ASSERT_DIE(n); ASSERT_DIE(n->prev); - do { n = n->prev; } while (n->prev); + node *nn = n; + do { nn = nn->prev; } while (nn->prev); - l = SKIP_BACK(list, head_node, n); + l = SKIP_BACK(list, head_node, nn); } int seen = 0; @@ -120,7 +121,7 @@ add_head(list *l, node *n) LIST_INLINE void insert_node(node *n, node *after) { - EXPENSIVE_CHECK(check_list(l, after)); + EXPENSIVE_CHECK((after->prev == NULL) || check_list(NULL, after)); ASSUME(n->prev == NULL); ASSUME(n->next == NULL); @@ -141,7 +142,7 @@ insert_node(node *n, node *after) LIST_INLINE void rem_node(node *n) { - EXPENSIVE_CHECK(check_list(NULL, n)); + EXPENSIVE_CHECK((n->prev == n) && (n->next == n) || check_list(NULL, n)); node *z = n->prev; node *x = n->next; |