xref: /aosp_15_r20/external/AFLplusplus/test/unittests/unit_maybe_alloc.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker #include <stdarg.h>
2*08b48e0bSAndroid Build Coastguard Worker #include <stddef.h>
3*08b48e0bSAndroid Build Coastguard Worker #include <setjmp.h>
4*08b48e0bSAndroid Build Coastguard Worker #include <assert.h>
5*08b48e0bSAndroid Build Coastguard Worker #include <cmocka.h>
6*08b48e0bSAndroid Build Coastguard Worker /* cmocka < 1.0 didn't support these features we need */
7*08b48e0bSAndroid Build Coastguard Worker #ifndef assert_ptr_equal
8*08b48e0bSAndroid Build Coastguard Worker #define assert_ptr_equal(a, b) \
9*08b48e0bSAndroid Build Coastguard Worker     _assert_int_equal(cast_ptr_to_largest_integral_type(a), \
10*08b48e0bSAndroid Build Coastguard Worker                       cast_ptr_to_largest_integral_type(b), \
11*08b48e0bSAndroid Build Coastguard Worker                       __FILE__, __LINE__)
12*08b48e0bSAndroid Build Coastguard Worker #define CMUnitTest UnitTest
13*08b48e0bSAndroid Build Coastguard Worker #define cmocka_unit_test unit_test
14*08b48e0bSAndroid Build Coastguard Worker #define cmocka_run_group_tests(t, setup, teardown) run_tests(t)
15*08b48e0bSAndroid Build Coastguard Worker #endif
16*08b48e0bSAndroid Build Coastguard Worker 
17*08b48e0bSAndroid Build Coastguard Worker 
18*08b48e0bSAndroid Build Coastguard Worker extern void mock_assert(const int result, const char* const expression,
19*08b48e0bSAndroid Build Coastguard Worker                         const char * const file, const int line);
20*08b48e0bSAndroid Build Coastguard Worker #undef assert
21*08b48e0bSAndroid Build Coastguard Worker #define assert(expression) \
22*08b48e0bSAndroid Build Coastguard Worker     mock_assert((int)(expression), #expression, __FILE__, __LINE__);
23*08b48e0bSAndroid Build Coastguard Worker #include "alloc-inl.h"
24*08b48e0bSAndroid Build Coastguard Worker 
25*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status);
26*08b48e0bSAndroid Build Coastguard Worker /* remap exit -> assert, then use cmocka's mock_assert
27*08b48e0bSAndroid Build Coastguard Worker     (compile with `--wrap=exit`) */
28*08b48e0bSAndroid Build Coastguard Worker extern void exit(int status);
29*08b48e0bSAndroid Build Coastguard Worker extern void __real_exit(int status);
__wrap_exit(int status)30*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status) {
31*08b48e0bSAndroid Build Coastguard Worker     (void) status;
32*08b48e0bSAndroid Build Coastguard Worker     assert(0);
33*08b48e0bSAndroid Build Coastguard Worker }
34*08b48e0bSAndroid Build Coastguard Worker 
35*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...);
36*08b48e0bSAndroid Build Coastguard Worker /* ignore all printfs */
37*08b48e0bSAndroid Build Coastguard Worker #undef printf
38*08b48e0bSAndroid Build Coastguard Worker extern int printf(const char *format, ...);
39*08b48e0bSAndroid Build Coastguard Worker //extern int __real_printf(const char *format, ...);
__wrap_printf(const char * format,...)40*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...) {
41*08b48e0bSAndroid Build Coastguard Worker     (void)format;
42*08b48e0bSAndroid Build Coastguard Worker     return 1;
43*08b48e0bSAndroid Build Coastguard Worker }
44*08b48e0bSAndroid Build Coastguard Worker 
45*08b48e0bSAndroid Build Coastguard Worker #define VOID_BUF (void **)&buf
46*08b48e0bSAndroid Build Coastguard Worker 
create_fake_maybe_grow_of(size_t size)47*08b48e0bSAndroid Build Coastguard Worker static void *create_fake_maybe_grow_of(size_t size) {
48*08b48e0bSAndroid Build Coastguard Worker 
49*08b48e0bSAndroid Build Coastguard Worker     size += AFL_ALLOC_SIZE_OFFSET;
50*08b48e0bSAndroid Build Coastguard Worker 
51*08b48e0bSAndroid Build Coastguard Worker     // fake a realloc buf
52*08b48e0bSAndroid Build Coastguard Worker 
53*08b48e0bSAndroid Build Coastguard Worker     struct afl_alloc_buf *buf = malloc(size);
54*08b48e0bSAndroid Build Coastguard Worker     if (!buf) {
55*08b48e0bSAndroid Build Coastguard Worker         perror("Could not allocate fake buf");
56*08b48e0bSAndroid Build Coastguard Worker         return NULL;
57*08b48e0bSAndroid Build Coastguard Worker     }
58*08b48e0bSAndroid Build Coastguard Worker     buf->complete_size = size; // The size
59*08b48e0bSAndroid Build Coastguard Worker     void *actual_buf = (void *)(buf->buf);
60*08b48e0bSAndroid Build Coastguard Worker     return actual_buf;
61*08b48e0bSAndroid Build Coastguard Worker 
62*08b48e0bSAndroid Build Coastguard Worker }
63*08b48e0bSAndroid Build Coastguard Worker 
64*08b48e0bSAndroid Build Coastguard Worker /*
65*08b48e0bSAndroid Build Coastguard Worker static int setup(void **state) {
66*08b48e0bSAndroid Build Coastguard Worker 
67*08b48e0bSAndroid Build Coastguard Worker     return 0;
68*08b48e0bSAndroid Build Coastguard Worker 
69*08b48e0bSAndroid Build Coastguard Worker }
70*08b48e0bSAndroid Build Coastguard Worker */
71*08b48e0bSAndroid Build Coastguard Worker 
test_pow2(void ** state)72*08b48e0bSAndroid Build Coastguard Worker static void test_pow2(void **state) {
73*08b48e0bSAndroid Build Coastguard Worker     (void)state;
74*08b48e0bSAndroid Build Coastguard Worker 
75*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(64), 64);
76*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(63), 64);
77*08b48e0bSAndroid Build Coastguard Worker     assert_int_not_equal(next_pow2(65), 65);
78*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(0x100), 0x100);
79*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(0x180), 0x200);
80*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(108), 0x80);
81*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(0), 0);
82*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(1), 1);
83*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(2), 2);
84*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(3), 4);
85*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(0xFFFFFF), 0x1000000);
86*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(0xFFFFFFF), 0x10000000);
87*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(0xFFFFFF0), 0x10000000);
88*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(SIZE_MAX), 0);
89*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(-1), 0);
90*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(next_pow2(-2), 0);
91*08b48e0bSAndroid Build Coastguard Worker 
92*08b48e0bSAndroid Build Coastguard Worker }
93*08b48e0bSAndroid Build Coastguard Worker 
test_null_allocs(void ** state)94*08b48e0bSAndroid Build Coastguard Worker static void test_null_allocs(void **state) {
95*08b48e0bSAndroid Build Coastguard Worker     (void)state;
96*08b48e0bSAndroid Build Coastguard Worker 
97*08b48e0bSAndroid Build Coastguard Worker     void *buf = NULL;
98*08b48e0bSAndroid Build Coastguard Worker     void *ptr = afl_realloc(VOID_BUF, 100);
99*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!buf)) { PFATAL("alloc"); }
100*08b48e0bSAndroid Build Coastguard Worker     size_t size = afl_alloc_bufsize(buf);
101*08b48e0bSAndroid Build Coastguard Worker     assert_true(buf == ptr);
102*08b48e0bSAndroid Build Coastguard Worker     assert_true(size >= 100);
103*08b48e0bSAndroid Build Coastguard Worker     afl_free(ptr);
104*08b48e0bSAndroid Build Coastguard Worker 
105*08b48e0bSAndroid Build Coastguard Worker }
106*08b48e0bSAndroid Build Coastguard Worker 
test_nonpow2_size(void ** state)107*08b48e0bSAndroid Build Coastguard Worker static void test_nonpow2_size(void **state) {
108*08b48e0bSAndroid Build Coastguard Worker     (void)state;
109*08b48e0bSAndroid Build Coastguard Worker 
110*08b48e0bSAndroid Build Coastguard Worker     char *buf = create_fake_maybe_grow_of(150);
111*08b48e0bSAndroid Build Coastguard Worker 
112*08b48e0bSAndroid Build Coastguard Worker     buf[140] = '5';
113*08b48e0bSAndroid Build Coastguard Worker 
114*08b48e0bSAndroid Build Coastguard Worker     char *ptr = afl_realloc(VOID_BUF, 160);
115*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!ptr)) { PFATAL("alloc"); }
116*08b48e0bSAndroid Build Coastguard Worker     size_t size = afl_alloc_bufsize(buf);
117*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(buf, ptr);
118*08b48e0bSAndroid Build Coastguard Worker     assert_true(size >= 160);
119*08b48e0bSAndroid Build Coastguard Worker     assert_true(buf[140] == '5');
120*08b48e0bSAndroid Build Coastguard Worker     afl_free(ptr);
121*08b48e0bSAndroid Build Coastguard Worker 
122*08b48e0bSAndroid Build Coastguard Worker }
123*08b48e0bSAndroid Build Coastguard Worker 
test_zero_size(void ** state)124*08b48e0bSAndroid Build Coastguard Worker static void test_zero_size(void **state) {
125*08b48e0bSAndroid Build Coastguard Worker     (void)state;
126*08b48e0bSAndroid Build Coastguard Worker 
127*08b48e0bSAndroid Build Coastguard Worker     char *buf = NULL;
128*08b48e0bSAndroid Build Coastguard Worker     size_t size = 0;
129*08b48e0bSAndroid Build Coastguard Worker     char *new_buf = afl_realloc(VOID_BUF, 0);
130*08b48e0bSAndroid Build Coastguard Worker     assert_non_null(new_buf);
131*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(buf, new_buf);
132*08b48e0bSAndroid Build Coastguard Worker     afl_free(buf);
133*08b48e0bSAndroid Build Coastguard Worker     buf = NULL;
134*08b48e0bSAndroid Build Coastguard Worker     size = 0;
135*08b48e0bSAndroid Build Coastguard Worker 
136*08b48e0bSAndroid Build Coastguard Worker     char *ptr = afl_realloc(VOID_BUF, 100);
137*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!ptr)) { PFATAL("alloc"); }
138*08b48e0bSAndroid Build Coastguard Worker     size = afl_alloc_bufsize(buf);
139*08b48e0bSAndroid Build Coastguard Worker     assert_non_null(ptr);
140*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(buf, ptr);
141*08b48e0bSAndroid Build Coastguard Worker     assert_true(size >= 100);
142*08b48e0bSAndroid Build Coastguard Worker 
143*08b48e0bSAndroid Build Coastguard Worker     afl_free(ptr);
144*08b48e0bSAndroid Build Coastguard Worker 
145*08b48e0bSAndroid Build Coastguard Worker }
146*08b48e0bSAndroid Build Coastguard Worker 
147*08b48e0bSAndroid Build Coastguard Worker 
test_unchanged_size(void ** state)148*08b48e0bSAndroid Build Coastguard Worker static void test_unchanged_size(void **state) {
149*08b48e0bSAndroid Build Coastguard Worker     (void)state;
150*08b48e0bSAndroid Build Coastguard Worker 
151*08b48e0bSAndroid Build Coastguard Worker     // fake a realloc buf
152*08b48e0bSAndroid Build Coastguard Worker     void *actual_buf = create_fake_maybe_grow_of(100);
153*08b48e0bSAndroid Build Coastguard Worker 
154*08b48e0bSAndroid Build Coastguard Worker     void *buf_before = actual_buf;
155*08b48e0bSAndroid Build Coastguard Worker     void *buf_after = afl_realloc(&actual_buf, 100);
156*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!buf_after)) { PFATAL("alloc"); }
157*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(actual_buf, buf_after);
158*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(buf_after, buf_before);
159*08b48e0bSAndroid Build Coastguard Worker     afl_free(buf_after);
160*08b48e0bSAndroid Build Coastguard Worker 
161*08b48e0bSAndroid Build Coastguard Worker }
162*08b48e0bSAndroid Build Coastguard Worker 
test_grow_multiple(void ** state)163*08b48e0bSAndroid Build Coastguard Worker static void test_grow_multiple(void **state) {
164*08b48e0bSAndroid Build Coastguard Worker     (void)state;
165*08b48e0bSAndroid Build Coastguard Worker 
166*08b48e0bSAndroid Build Coastguard Worker     char *buf = NULL;
167*08b48e0bSAndroid Build Coastguard Worker     size_t size = 0;
168*08b48e0bSAndroid Build Coastguard Worker 
169*08b48e0bSAndroid Build Coastguard Worker     char *ptr = afl_realloc(VOID_BUF, 100);
170*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!ptr)) { PFATAL("alloc"); }
171*08b48e0bSAndroid Build Coastguard Worker     size = afl_alloc_bufsize(ptr);
172*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(ptr, buf);
173*08b48e0bSAndroid Build Coastguard Worker     assert_true(size >= 100);
174*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(size, next_pow2(size) - AFL_ALLOC_SIZE_OFFSET);
175*08b48e0bSAndroid Build Coastguard Worker     buf[50] = '5';
176*08b48e0bSAndroid Build Coastguard Worker 
177*08b48e0bSAndroid Build Coastguard Worker     ptr = (char *)afl_realloc(VOID_BUF, 1000);
178*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!ptr)) { PFATAL("alloc"); }
179*08b48e0bSAndroid Build Coastguard Worker     size = afl_alloc_bufsize(ptr);
180*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(ptr, buf);
181*08b48e0bSAndroid Build Coastguard Worker     assert_true(size >= 100);
182*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(size, next_pow2(size) - AFL_ALLOC_SIZE_OFFSET);
183*08b48e0bSAndroid Build Coastguard Worker     buf[500] = '5';
184*08b48e0bSAndroid Build Coastguard Worker 
185*08b48e0bSAndroid Build Coastguard Worker     ptr = (char *)afl_realloc(VOID_BUF, 10000);
186*08b48e0bSAndroid Build Coastguard Worker     if (unlikely(!ptr)) { PFATAL("alloc"); }
187*08b48e0bSAndroid Build Coastguard Worker     size = afl_alloc_bufsize(ptr);
188*08b48e0bSAndroid Build Coastguard Worker     assert_ptr_equal(ptr, buf);
189*08b48e0bSAndroid Build Coastguard Worker     assert_true(size >= 10000);
190*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(size, next_pow2(size) - AFL_ALLOC_SIZE_OFFSET);
191*08b48e0bSAndroid Build Coastguard Worker     buf[5000] = '5';
192*08b48e0bSAndroid Build Coastguard Worker 
193*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(buf[50], '5');
194*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(buf[500], '5');
195*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(buf[5000], '5');
196*08b48e0bSAndroid Build Coastguard Worker 
197*08b48e0bSAndroid Build Coastguard Worker     afl_free(buf);
198*08b48e0bSAndroid Build Coastguard Worker 
199*08b48e0bSAndroid Build Coastguard Worker }
200*08b48e0bSAndroid Build Coastguard Worker 
201*08b48e0bSAndroid Build Coastguard Worker /*
202*08b48e0bSAndroid Build Coastguard Worker static int teardown(void **state) {
203*08b48e0bSAndroid Build Coastguard Worker 
204*08b48e0bSAndroid Build Coastguard Worker     return 0;
205*08b48e0bSAndroid Build Coastguard Worker 
206*08b48e0bSAndroid Build Coastguard Worker }
207*08b48e0bSAndroid Build Coastguard Worker */
208*08b48e0bSAndroid Build Coastguard Worker 
main(int argc,char ** argv)209*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
210*08b48e0bSAndroid Build Coastguard Worker     (void)argc;
211*08b48e0bSAndroid Build Coastguard Worker     (void)argv;
212*08b48e0bSAndroid Build Coastguard Worker 
213*08b48e0bSAndroid Build Coastguard Worker 	const struct CMUnitTest tests[] = {
214*08b48e0bSAndroid Build Coastguard Worker 		cmocka_unit_test(test_pow2),
215*08b48e0bSAndroid Build Coastguard Worker 		cmocka_unit_test(test_null_allocs),
216*08b48e0bSAndroid Build Coastguard Worker 		cmocka_unit_test(test_nonpow2_size),
217*08b48e0bSAndroid Build Coastguard Worker 		cmocka_unit_test(test_zero_size),
218*08b48e0bSAndroid Build Coastguard Worker         cmocka_unit_test(test_unchanged_size),
219*08b48e0bSAndroid Build Coastguard Worker         cmocka_unit_test(test_grow_multiple),
220*08b48e0bSAndroid Build Coastguard Worker 	};
221*08b48e0bSAndroid Build Coastguard Worker 
222*08b48e0bSAndroid Build Coastguard Worker     //return cmocka_run_group_tests (tests, setup, teardown);
223*08b48e0bSAndroid Build Coastguard Worker     __real_exit( cmocka_run_group_tests (tests, NULL, NULL) );
224*08b48e0bSAndroid Build Coastguard Worker 
225*08b48e0bSAndroid Build Coastguard Worker     // fake return for dumb compilers
226*08b48e0bSAndroid Build Coastguard Worker     return 0;
227*08b48e0bSAndroid Build Coastguard Worker }
228