equal/hKis/test/testallocate.c
2022-10-25 18:36:19 +08:00

105 lines
2.5 KiB
C

#include "test.h"
#include "../src/allocate.h"
#include "../src/error.h"
#include <string.h>
static void
test_allocate_basic (void)
{
DECLARE_AND_INIT_SOLVER (solver);
int *p = kissat_malloc (solver, 1 << 30);
assume (kissat_aligned_pointer (p));
kissat_free (solver, p, 1 << 30);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
assert (solver->statistics.allocated_max == 1u << 30);
#endif
p = kissat_calloc (solver, 1 << 28, 4);
assume (kissat_aligned_pointer (p));
for (unsigned i = 0; i < 28; i++)
assert (!p[1u << i]);
kissat_dealloc (solver, p, 1 << 28, 4);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
assert (solver->statistics.allocated_max == 1u << 30);
#endif
char *s = kissat_strdup (solver, "test");
assume (kissat_aligned_pointer (s));
assert (!strcmp (s, "test"));
#ifndef NMETRICS
assert (solver->statistics.allocated_current == 5);
#endif
kissat_delstr (solver, s);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
#endif
}
static void
test_allocate_coverage (void)
{
DECLARE_AND_INIT_SOLVER (solver);
void *p = kissat_nrealloc (solver, 0, 0, 0, 0);
assert (!p);
p = kissat_realloc (solver, 0, 0, 0);
assert (!p);
}
#ifndef ASAN
#include <setjmp.h>
static jmp_buf jump_buffer;
static void
abort_call_back (void)
{
longjmp (jump_buffer, 42);
}
#define ALLOCATION_ERROR(CALL) \
do { \
kissat_call_function_instead_of_abort (abort_call_back); \
int val = setjmp (jump_buffer); \
if (val) \
{ \
kissat_call_function_instead_of_abort (0); \
if (val != 42) \
FATAL ("expected '42' as result of 'setjmp' for '" #CALL "'"); \
} \
else \
{ \
CALL; \
kissat_call_function_instead_of_abort (0); \
FATAL ("long jump not taken in '" #CALL "'"); \
} \
} while (0)
static void
test_allocate_error (void)
{
DECLARE_AND_INIT_SOLVER (solver);
ALLOCATION_ERROR (kissat_malloc (solver, MAX_SIZE_T));
ALLOCATION_ERROR (kissat_calloc (solver, MAX_SIZE_T, MAX_SIZE_T));
ALLOCATION_ERROR (kissat_calloc (solver, 1, MAX_SIZE_T));
ALLOCATION_ERROR (kissat_calloc (solver, MAX_SIZE_T, 1));
ALLOCATION_ERROR (kissat_realloc (solver, 0, 0, MAX_SIZE_T));
ALLOCATION_ERROR (kissat_nrealloc (solver, 0, 0, MAX_SIZE_T, MAX_SIZE_T));
ALLOCATION_ERROR (kissat_dealloc (solver, 0, MAX_SIZE_T, MAX_SIZE_T));
}
#endif
void
tissat_schedule_allocate (void)
{
SCHEDULE_FUNCTION (test_allocate_basic);
SCHEDULE_FUNCTION (test_allocate_coverage);
#ifndef ASAN
SCHEDULE_FUNCTION (test_allocate_error);
#endif
}