1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
From 63e0dc5c9e25b940043ec828de731b7bd412f734 Mon Sep 17 00:00:00 2001
From: Justus Winter <justus@gnupg.org>
Date: Mon, 25 Apr 2016 17:58:52 +0200
Subject: [PATCH hurd 3/3] libshouldbeinlibc: use the new assert in the
refcount primitives
* libshouldbeinlibc/refcount.h: Use 'assert_backtrace'.
---
libshouldbeinlibc/refcount.h | 41 +++++++++++++++++++++++++----------------
1 file changed, 25 insertions(+), 16 deletions(-)
diff --git a/libshouldbeinlibc/refcount.h b/libshouldbeinlibc/refcount.h
index e8b0f5b..0d1fa28 100644
--- a/libshouldbeinlibc/refcount.h
+++ b/libshouldbeinlibc/refcount.h
@@ -28,7 +28,7 @@
#define REFCOUNT_EI __extern_inline
#endif
-#include <assert.h>
+#include <assert-backtrace.h>
#include <limits.h>
#include <stdint.h>
@@ -41,7 +41,7 @@ typedef unsigned int refcount_t;
REFCOUNT_EI void
refcount_init (refcount_t *ref, unsigned int references)
{
- assert (references > 0 || !"references must not be zero!");
+ assert_backtrace (references > 0 || !"references must not be zero!");
*ref = references;
}
@@ -57,7 +57,7 @@ refcount_unsafe_ref (refcount_t *ref)
{
unsigned int r;
r = __atomic_add_fetch (ref, 1, __ATOMIC_RELAXED);
- assert (r != UINT_MAX || !"refcount overflowed!");
+ assert_backtrace (r != UINT_MAX || !"refcount overflowed!");
return r;
}
@@ -69,7 +69,7 @@ refcount_ref (refcount_t *ref)
{
unsigned int r;
r = refcount_unsafe_ref (ref);
- assert (r != 1 || !"refcount detected use-after-free!");
+ assert_backtrace (r != 1 || !"refcount detected use-after-free!");
return r;
}
@@ -81,7 +81,7 @@ refcount_deref (refcount_t *ref)
{
unsigned int r;
r = __atomic_sub_fetch (ref, 1, __ATOMIC_RELAXED);
- assert (r != UINT_MAX || !"refcount underflowed!");
+ assert_backtrace (r != UINT_MAX || !"refcount underflowed!");
return r;
}
@@ -129,7 +129,8 @@ union _references {
REFCOUNT_EI void
refcounts_init (refcounts_t *ref, uint32_t hard, uint32_t weak)
{
- assert ((hard != 0 || weak != 0) || !"references must not both be zero!");
+ assert_backtrace ((hard != 0 || weak != 0)
+ || !"references must not both be zero!");
ref->references = (struct references) { .hard = hard, .weak = weak };
}
@@ -147,7 +148,8 @@ refcounts_unsafe_ref (refcounts_t *ref, struct references *result)
const union _references op = { .references = { .hard = 1 } };
union _references r;
r.value = __atomic_add_fetch (&ref->value, op.value, __ATOMIC_RELAXED);
- assert (r.references.hard != UINT32_MAX || !"refcount overflowed!");
+ assert_backtrace (r.references.hard != UINT32_MAX
+ || !"refcount overflowed!");
if (result)
*result = r.references;
}
@@ -161,7 +163,7 @@ refcounts_ref (refcounts_t *ref, struct references *result)
{
struct references r;
refcounts_unsafe_ref (ref, &r);
- assert (! (r.hard == 1 && r.weak == 0)
+ assert_backtrace (! (r.hard == 1 && r.weak == 0)
|| !"refcount detected use-after-free!");
if (result)
*result = r;
@@ -177,7 +179,8 @@ refcounts_deref (refcounts_t *ref, struct references *result)
const union _references op = { .references = { .hard = 1 } };
union _references r;
r.value = __atomic_sub_fetch (&ref->value, op.value, __ATOMIC_RELAXED);
- assert (r.references.hard != UINT32_MAX || !"refcount underflowed!");
+ assert_backtrace (r.references.hard != UINT32_MAX
+ || !"refcount underflowed!");
if (result)
*result = r.references;
}
@@ -207,8 +210,10 @@ refcounts_promote (refcounts_t *ref, struct references *result)
{ .references = { .weak = ~0U, .hard = 1} };
union _references r;
r.value = __atomic_add_fetch (&ref->value, op.value, __ATOMIC_RELAXED);
- assert (r.references.hard != UINT32_MAX || !"refcount overflowed!");
- assert (r.references.weak != UINT32_MAX || !"refcount underflowed!");
+ assert_backtrace (r.references.hard != UINT32_MAX
+ || !"refcount overflowed!");
+ assert_backtrace (r.references.weak != UINT32_MAX
+ || !"refcount underflowed!");
if (result)
*result = r.references;
}
@@ -235,8 +240,10 @@ refcounts_demote (refcounts_t *ref, struct references *result)
const union _references op = { .references = { .hard = ~0U } };
union _references r;
r.value = __atomic_add_fetch (&ref->value, op.value, __ATOMIC_RELAXED);
- assert (r.references.hard != UINT32_MAX || !"refcount underflowed!");
- assert (r.references.weak != UINT32_MAX || !"refcount overflowed!");
+ assert_backtrace (r.references.hard != UINT32_MAX
+ || !"refcount underflowed!");
+ assert_backtrace (r.references.weak != UINT32_MAX
+ || !"refcount overflowed!");
if (result)
*result = r.references;
}
@@ -255,7 +262,8 @@ refcounts_unsafe_ref_weak (refcounts_t *ref, struct references *result)
const union _references op = { .references = { .weak = 1 } };
union _references r;
r.value = __atomic_add_fetch (&ref->value, op.value, __ATOMIC_RELAXED);
- assert (r.references.weak != UINT32_MAX || !"refcount overflowed!");
+ assert_backtrace (r.references.weak != UINT32_MAX
+ || !"refcount overflowed!");
if (result)
*result = r.references;
}
@@ -269,7 +277,7 @@ refcounts_ref_weak (refcounts_t *ref, struct references *result)
{
struct references r;
refcounts_unsafe_ref_weak (ref, &r);
- assert (! (r.hard == 0 && r.weak == 1)
+ assert_backtrace (! (r.hard == 0 && r.weak == 1)
|| !"refcount detected use-after-free!");
if (result)
*result = r;
@@ -285,7 +293,8 @@ refcounts_deref_weak (refcounts_t *ref, struct references *result)
const union _references op = { .references = { .weak = 1 } };
union _references r;
r.value = __atomic_sub_fetch (&ref->value, op.value, __ATOMIC_RELAXED);
- assert (r.references.weak != UINT32_MAX || !"refcount underflowed!");
+ assert_backtrace (r.references.weak != UINT32_MAX
+ || !"refcount underflowed!");
if (result)
*result = r.references;
}
--
2.1.4
|