97 lines
2.0 KiB
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;
|
|
}
|