selfpatch-slr/selfpatch/test/randomizer_test.c

97 lines
2.0 KiB
C

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <spslr_list_link.h>
#include <randomizer.h>
void *spslr_env_malloc(size_t size) {
return malloc(size);
}
void spslr_env_free(void *ptr) {
free(ptr);
}
uint32_t spslr_env_random_u32(void) {
return ((uint32_t)rand() << 16) ^ (uint32_t)rand();
}
const uint32_t spslr_target_cnt = 1;
const uint32_t spslr_target_field_cnt = 4;
const struct spslr_target spslr_targets[] = {
{
.size = 24,
.fieldcnt = 4,
.fieldoff = 0,
},
};
const struct spslr_target_field spslr_target_fields[] = {
{ .offset = 0, .size = 4, .alignment = 4, .flags = 0 },
{ .offset = 4, .size = 4, .alignment = 4, .flags = 0 },
{ .offset = 8, .size = 4, .alignment = 4, .flags = 0 },
{ .offset = 16, .size = 8, .alignment = 8, .flags = 0 },
};
static int check_target(uint32_t tidx) {
uint32_t tsize, fieldcnt;
if (spslr_randomizer_get_target(tidx, &tsize, &fieldcnt) < 0)
return -1;
uint32_t cur_end = 0;
for (uint32_t i = 0; i < fieldcnt; i++) {
struct spslr_randomizer_field_info finfo;
if (spslr_randomizer_get_field(tidx, i, SPSLR_RANDOMIZER_FIELD_IDX_MODE_FINAL, &finfo) < 0)
return -1;
if (finfo.offset < cur_end)
return -1;
if (finfo.offset % finfo.alignment != 0)
return -1;
if ((finfo.flags & SPSLR_FLAG_FIELD_FIXED) && finfo.offset != finfo.initial_offset)
return -1;
if (finfo.offset + finfo.size > tsize)
return -1;
cur_end = finfo.offset + finfo.size;
}
return 0;
}
int main(void) {
srand((unsigned)time(NULL));
for (uint32_t iter = 0; iter < 1000000; iter++) {
if (spslr_randomizer_init() < 0) {
fprintf(stderr, "init failed\n");
return 1;
}
if (spslr_randomize() < 0) {
fprintf(stderr, "randomize failed at iter %u\n", iter);
return 1;
}
for (uint32_t tidx = 0; tidx < spslr_target_cnt; tidx++) {
if (check_target(tidx) < 0) {
fprintf(stderr, "check failed at iter %u target %u\n", iter, tidx);
return 1;
}
}
spslr_randomizer_clear();
}
printf("ok: 1000000 iterations\n");
return 0;
}