#include #include #include #include #include #include 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; }