]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-alloc-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include "alloc-util.h"
8 #include "memory-util.h"
11 static void test_alloca(void) {
12 static const uint8_t zero
[997] = { };
15 t
= alloca_align(17, 512);
16 assert_se(!((uintptr_t)t
& 0xff));
19 t
= alloca0_align(997, 1024);
20 assert_se(!((uintptr_t)t
& 0x1ff));
21 assert_se(!memcmp(t
, zero
, 997));
24 static void test_GREEDY_REALLOC(void) {
25 _cleanup_free_
int *a
= NULL
, *b
= NULL
;
26 size_t n_allocated
= 0, i
, j
;
28 /* Give valgrind a chance to verify our realloc() operations */
30 for (i
= 0; i
< 20480; i
++) {
31 assert_se(GREEDY_REALLOC(a
, n_allocated
, i
+ 1));
32 assert_se(n_allocated
>= i
+ 1);
33 assert_se(malloc_usable_size(a
) >= (i
+ 1) * sizeof(int));
35 assert_se(GREEDY_REALLOC(a
, n_allocated
, i
/ 2));
36 assert_se(n_allocated
>= i
/ 2);
37 assert_se(malloc_usable_size(a
) >= (i
/ 2) * sizeof(int));
40 for (j
= 0; j
< i
/ 2; j
++)
41 assert_se(a
[j
] == (int) j
);
43 for (i
= 30, n_allocated
= 0; i
< 20480; i
+= 7) {
44 assert_se(GREEDY_REALLOC(b
, n_allocated
, i
+ 1));
45 assert_se(n_allocated
>= i
+ 1);
46 assert_se(malloc_usable_size(b
) >= (i
+ 1) * sizeof(int));
48 assert_se(GREEDY_REALLOC(b
, n_allocated
, i
/ 2));
49 assert_se(n_allocated
>= i
/ 2);
50 assert_se(malloc_usable_size(b
) >= (i
/ 2) * sizeof(int));
53 for (j
= 30; j
< i
/ 2; j
+= 7)
54 assert_se(b
[j
] == (int) j
);
57 static void test_memdup_multiply_and_greedy_realloc(void) {
58 int org
[] = {1, 2, 3};
59 _cleanup_free_
int *dup
;
61 size_t i
, allocated
= 3;
63 dup
= (int*) memdup_suffix0_multiply(org
, sizeof(int), 3);
65 assert_se(dup
[0] == 1);
66 assert_se(dup
[1] == 2);
67 assert_se(dup
[2] == 3);
68 assert_se(*(uint8_t*) (dup
+ 3) == (uint8_t) 0);
71 dup
= (int*) memdup_multiply(org
, sizeof(int), 3);
73 assert_se(dup
[0] == 1);
74 assert_se(dup
[1] == 2);
75 assert_se(dup
[2] == 3);
78 assert_se(greedy_realloc0((void**) &dup
, &allocated
, 2, sizeof(int)) == p
);
80 p
= (int *) greedy_realloc0((void**) &dup
, &allocated
, 10, sizeof(int));
82 assert_se(allocated
>= 10);
86 for (i
= 3; i
< allocated
; i
++)
90 static void test_bool_assign(void) {
91 bool b
, c
, *cp
= &c
, d
, e
, f
, g
, h
;
98 g
= cp
; /* cast from pointer */
99 h
= NULL
; /* cast from pointer */
110 static int cleanup_counter
= 0;
112 static void cleanup1(void *a
) {
113 log_info("%s(%p)", __func__
, a
);
114 assert_se(++cleanup_counter
== *(int*) a
);
116 static void cleanup2(void *a
) {
117 log_info("%s(%p)", __func__
, a
);
118 assert_se(++cleanup_counter
== *(int*) a
);
120 static void cleanup3(void *a
) {
121 log_info("%s(%p)", __func__
, a
);
122 assert_se(++cleanup_counter
== *(int*) a
);
125 static void test_cleanup_order(void) {
126 _cleanup_(cleanup1
) int x1
= 4, x2
= 3;
127 _cleanup_(cleanup3
) int z
= 2;
128 _cleanup_(cleanup2
) int y
= 1;
129 log_debug("x1: %p", &x1
);
130 log_debug("x2: %p", &x2
);
131 log_debug("y: %p", &y
);
132 log_debug("z: %p", &z
);
135 int main(int argc
, char *argv
[]) {
136 test_setup_logging(LOG_DEBUG
);
139 test_GREEDY_REALLOC();
140 test_memdup_multiply_and_greedy_realloc();
142 test_cleanup_order();