radare2: r_reg_get: утверждение 'reg && name' не выполнено (строка 296) - PullRequest
2 голосов
/ 01 октября 2019

Я разрабатываю плагин asm для radare2. Я реализовал функцию дизассемблирования, поэтому она возвращает дизассемблированную инструкцию, используя:

r_strbuf_set (&op->buf_asm, line);

Теперь, когда я установил asm.arch в моей новой архитектуре, я могу видеть содержимое строковой переменной, набрав pd. Однако перед печатью дизассемблированной программы я получаю кучу предупреждений:

WARNING: r_reg_get: assertion 'reg && name' failed (line 296)

Это происходит после завершения моей функции дизассемблирования, для каждой инструкции, обработанной моим кодом. Что может быть источником такой ошибки? Кажется, это не связано со структурой кода операции, я заполняю и скорее отношусь к именам регистров. Требуется ли реализация анального плагина, в дополнение к плагину asm? Обычно я вижу, что оба доступны для поддерживаемых архитектур.

1 Ответ

0 голосов
/ 08 октября 2019

Реализация фиктивного анального плагина достаточно для предотвращения появления этого предупреждения. Я добавил следующую функцию и передал ее новому плагину:

static int mycpu_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *b, int len) {
  r_strbuf_init (&op->esil);
  op->size = 4;
  return op->size;
}

Позднее указывается, как показано ниже:

RAnalPlugin r_anal_plugin_mycpu = {
    .name = "mycpu",
    .desc = "Long name",
    .license = "LGPL3",
    .bits = 32,
    .op = &mycpu_op
}

#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
    .type = R_LIB_TYPE_ANAL,
    .data = &r_anal_plugin_mycpu,
    .version = R2_VERSION
};
#endif
...