xref: /aosp_15_r20/external/AFLplusplus/test/unittests/unit_preallocable.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 
24*08b48e0bSAndroid Build Coastguard Worker #include "afl-prealloc.h"
25*08b48e0bSAndroid Build Coastguard Worker 
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);
30*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status);
__wrap_exit(int status)31*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status) {
32*08b48e0bSAndroid Build Coastguard Worker     (void)status;
33*08b48e0bSAndroid Build Coastguard Worker     assert(0);
34*08b48e0bSAndroid Build Coastguard Worker }
35*08b48e0bSAndroid Build Coastguard Worker 
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, ...);
40*08b48e0bSAndroid Build Coastguard Worker //int __wrap_printf(const char *format, ...);
__wrap_printf(const char * format,...)41*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...) {
42*08b48e0bSAndroid Build Coastguard Worker     (void)format;
43*08b48e0bSAndroid Build Coastguard Worker     return 1;
44*08b48e0bSAndroid Build Coastguard Worker }
45*08b48e0bSAndroid Build Coastguard Worker 
46*08b48e0bSAndroid Build Coastguard Worker typedef struct prealloc_me
47*08b48e0bSAndroid Build Coastguard Worker {
48*08b48e0bSAndroid Build Coastguard Worker     PREALLOCABLE;
49*08b48e0bSAndroid Build Coastguard Worker 
50*08b48e0bSAndroid Build Coastguard Worker     u8 *content[128];
51*08b48e0bSAndroid Build Coastguard Worker 
52*08b48e0bSAndroid Build Coastguard Worker } element_t;
53*08b48e0bSAndroid Build Coastguard Worker 
54*08b48e0bSAndroid Build Coastguard Worker #define PREALLOCED_BUF_SIZE (64)
55*08b48e0bSAndroid Build Coastguard Worker element_t prealloc_me_buf[PREALLOCED_BUF_SIZE];
56*08b48e0bSAndroid Build Coastguard Worker s32 prealloc_me_size = 0;
57*08b48e0bSAndroid Build Coastguard Worker 
test_alloc_free(void ** state)58*08b48e0bSAndroid Build Coastguard Worker static void test_alloc_free(void **state) {
59*08b48e0bSAndroid Build Coastguard Worker     (void)state;
60*08b48e0bSAndroid Build Coastguard Worker 
61*08b48e0bSAndroid Build Coastguard Worker     element_t *prealloced = NULL;
62*08b48e0bSAndroid Build Coastguard Worker     PRE_ALLOC(prealloced, prealloc_me_buf, PREALLOCED_BUF_SIZE, prealloc_me_size);
63*08b48e0bSAndroid Build Coastguard Worker     assert_non_null(prealloced);
64*08b48e0bSAndroid Build Coastguard Worker     PRE_FREE(prealloced, prealloc_me_size);
65*08b48e0bSAndroid Build Coastguard Worker 
66*08b48e0bSAndroid Build Coastguard Worker }
67*08b48e0bSAndroid Build Coastguard Worker 
test_prealloc_overflow(void ** state)68*08b48e0bSAndroid Build Coastguard Worker static void test_prealloc_overflow(void **state) {
69*08b48e0bSAndroid Build Coastguard Worker     (void)state;
70*08b48e0bSAndroid Build Coastguard Worker 
71*08b48e0bSAndroid Build Coastguard Worker     u32 i = 0;
72*08b48e0bSAndroid Build Coastguard Worker     element_t *prealloced[PREALLOCED_BUF_SIZE + 10];
73*08b48e0bSAndroid Build Coastguard Worker 
74*08b48e0bSAndroid Build Coastguard Worker     for (i = 0; i < PREALLOCED_BUF_SIZE + 10; i++) {
75*08b48e0bSAndroid Build Coastguard Worker 
76*08b48e0bSAndroid Build Coastguard Worker         PRE_ALLOC(prealloced[i], prealloc_me_buf, PREALLOCED_BUF_SIZE, prealloc_me_size);
77*08b48e0bSAndroid Build Coastguard Worker         assert_non_null(prealloced[i]);
78*08b48e0bSAndroid Build Coastguard Worker 
79*08b48e0bSAndroid Build Coastguard Worker     }
80*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(prealloced[0]->pre_status,  PRE_STATUS_USED);
81*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(prealloced[PREALLOCED_BUF_SIZE]->pre_status,  PRE_STATUS_MALLOC);
82*08b48e0bSAndroid Build Coastguard Worker 
83*08b48e0bSAndroid Build Coastguard Worker     PRE_FREE(prealloced[20], prealloc_me_size);
84*08b48e0bSAndroid Build Coastguard Worker     PRE_ALLOC(prealloced[20], prealloc_me_buf, PREALLOCED_BUF_SIZE, prealloc_me_size);
85*08b48e0bSAndroid Build Coastguard Worker     assert_non_null(prealloced[20]);
86*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(prealloced[20]->pre_status,  PRE_STATUS_USED);
87*08b48e0bSAndroid Build Coastguard Worker 
88*08b48e0bSAndroid Build Coastguard Worker     PRE_FREE(prealloced[PREALLOCED_BUF_SIZE], prealloc_me_size);
89*08b48e0bSAndroid Build Coastguard Worker     PRE_FREE(prealloced[0], prealloc_me_size);
90*08b48e0bSAndroid Build Coastguard Worker     PRE_ALLOC(prealloced[PREALLOCED_BUF_SIZE], prealloc_me_buf, PREALLOCED_BUF_SIZE, prealloc_me_size);
91*08b48e0bSAndroid Build Coastguard Worker     assert_non_null(prealloced[PREALLOCED_BUF_SIZE]);
92*08b48e0bSAndroid Build Coastguard Worker     /* there should be space now! */
93*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(prealloced[PREALLOCED_BUF_SIZE]->pre_status,  PRE_STATUS_USED);
94*08b48e0bSAndroid Build Coastguard Worker 
95*08b48e0bSAndroid Build Coastguard Worker     PRE_ALLOC(prealloced[0], prealloc_me_buf, PREALLOCED_BUF_SIZE, prealloc_me_size);
96*08b48e0bSAndroid Build Coastguard Worker     assert_non_null(prealloced[0]);
97*08b48e0bSAndroid Build Coastguard Worker     /* no more space */
98*08b48e0bSAndroid Build Coastguard Worker     assert_int_equal(prealloced[0]->pre_status,  PRE_STATUS_MALLOC);
99*08b48e0bSAndroid Build Coastguard Worker 
100*08b48e0bSAndroid Build Coastguard Worker     for (i = 0; i < PREALLOCED_BUF_SIZE + 10; i++) {
101*08b48e0bSAndroid Build Coastguard Worker 
102*08b48e0bSAndroid Build Coastguard Worker         PRE_FREE(prealloced[i], prealloc_me_size);
103*08b48e0bSAndroid Build Coastguard Worker 
104*08b48e0bSAndroid Build Coastguard Worker     }
105*08b48e0bSAndroid Build Coastguard Worker 
106*08b48e0bSAndroid Build Coastguard Worker }
107*08b48e0bSAndroid Build Coastguard Worker 
main(int argc,char ** argv)108*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
109*08b48e0bSAndroid Build Coastguard Worker     (void)argc;
110*08b48e0bSAndroid Build Coastguard Worker     (void)argv;
111*08b48e0bSAndroid Build Coastguard Worker 
112*08b48e0bSAndroid Build Coastguard Worker 	const struct CMUnitTest tests[] = {
113*08b48e0bSAndroid Build Coastguard Worker 		cmocka_unit_test(test_alloc_free),
114*08b48e0bSAndroid Build Coastguard Worker 		cmocka_unit_test(test_prealloc_overflow),
115*08b48e0bSAndroid Build Coastguard Worker 	};
116*08b48e0bSAndroid Build Coastguard Worker 
117*08b48e0bSAndroid Build Coastguard Worker     //return cmocka_run_group_tests (tests, setup, teardown);
118*08b48e0bSAndroid Build Coastguard Worker     __real_exit( cmocka_run_group_tests (tests, NULL, NULL) );
119*08b48e0bSAndroid Build Coastguard Worker 
120*08b48e0bSAndroid Build Coastguard Worker     // fake return for dumb compilers
121*08b48e0bSAndroid Build Coastguard Worker     return 0;
122*08b48e0bSAndroid Build Coastguard Worker }
123