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