The UC instance must be created twice to reproduce the problem (#1382)

* The UC instance must be created twice to reproduce the problem

* Fix coding style
This commit is contained in:
lazymio 2021-04-10 03:30:24 +08:00 committed by GitHub
parent 21ec6e8f83
commit f1f59bac55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -132,17 +132,14 @@ static void test_thumb(void)
uc_close(uc);
}
static void test_thumb_ite() {
static void test_thumb_ite_internal(bool step, uint32_t *r2_out, uint32_t *r3_out)
{
uc_engine *uc;
uc_err err;
uint32_t sp = 0x1234;
uint32_t r2 = 0, r3 = 1;
uint32_t step_r2, step_r3;
int i, addr=ADDRESS;
printf("Emulate a THUMB ITE block as a whole or per instruction.\n");
err = uc_open(UC_ARCH_ARM, UC_MODE_THUMB, &uc);
if (err) {
printf("Failed on uc_open() with error returned: %u (%s)\n",
@ -159,42 +156,55 @@ static void test_thumb_ite() {
uc_reg_write(uc, UC_ARM_REG_R2, &r2);
uc_reg_write(uc, UC_ARM_REG_R3, &r3);
// Run once.
printf("Running the entire binary.\n");
err = uc_emu_start(uc, ADDRESS | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 0);
if (err) {
printf("Failed on uc_emu_start() with error returned: %u\n", err);
if (!step) {
err = uc_emu_start(uc, ADDRESS | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 0);
if (err) {
printf("Failed on uc_emu_start() with error returned: %u\n", err);
}
} else {
int i, addr = ADDRESS;
for (i = 0; i < sizeof(ARM_THUM_COND_CODE) / 2; i++) {
err = uc_emu_start(uc, addr | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 1);
if (err) {
printf("Failed on uc_emu_start() with error returned: %u\n", err);
}
uc_reg_read(uc, UC_ARM_REG_PC, &addr);
}
}
uc_reg_read(uc, UC_ARM_REG_R2, &r2);
uc_reg_read(uc, UC_ARM_REG_R3, &r3);
uc_close(uc);
*r2_out = r2;
*r3_out = r3;
}
static void test_thumb_ite()
{
uint32_t r2, r3;
uint32_t step_r2, step_r3;
printf("Emulate a THUMB ITE block as a whole or per instruction.\n");
// Run once.
printf("Running the entire binary.\n");
test_thumb_ite_internal(false, &r2, &r3);
printf(">>> R2: %d\n", r2);
printf(">>> R3: %d\n\n", r3);
// Step each instruction.
printf("Running the binary one instruction at a time.\n");
for (i = 0; i < sizeof(ARM_THUM_COND_CODE) / 2; i++) {
err = uc_emu_start(uc, addr | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 1);
if (err) {
printf("Failed on uc_emu_start() with error returned: %u\n", err);
}
uc_reg_read(uc, UC_ARM_REG_PC, &addr);
}
uc_reg_read(uc, UC_ARM_REG_R2, &step_r2);
uc_reg_read(uc, UC_ARM_REG_R3, &step_r3);
test_thumb_ite_internal(true, &step_r2, &step_r3);
printf(">>> R2: %d\n", step_r2);
printf(">>> R3: %d\n\n", step_r3);
if (step_r2 != r2 || step_r3 != r3) {
printf("Failed with ARM ITE blocks stepping!\n");
}
uc_close(uc);
}
int main(int argc, char **argv, char **envp)
{
// dynamically load shared library