42 lines
1.5 KiB
JavaScript
42 lines
1.5 KiB
JavaScript
import assert from "node:assert/strict";
|
|
|
|
/** Verify batch selector/entry separation against real source-owned Ghidra functions. */
|
|
export async function verifyGhidraBatchIdentity(call, names) {
|
|
const leaf = names.find((item) =>
|
|
item.value.endsWith("rea_ghidra_inventory_leaf"),
|
|
);
|
|
assert.ok(leaf, "Source fixture lacks a leaf procedure");
|
|
const listing = await call("read_function_instructions", {
|
|
procedure: leaf.address,
|
|
});
|
|
const interior = listing.instructions[1]?.split(": ")[0];
|
|
assert.ok(interior, "Source fixture lacks an interior instruction");
|
|
const name = await call("address_name", { address: leaf.address });
|
|
const selectors = [leaf.address, interior, leaf.value, "0x0"];
|
|
const result = await call("batch_decompile", { addresses: selectors });
|
|
assert.equal(result.total, 4);
|
|
assert.equal(result.succeeded, 3);
|
|
assert.equal(result.failed, 1);
|
|
for (let index = 0; index < 3; index++) {
|
|
const item = result.items[index];
|
|
assert.equal(item.address, selectors[index]);
|
|
assert.equal(item.status, "ok");
|
|
assert.deepEqual(item.procedure, {
|
|
status: "resolved",
|
|
address: leaf.address,
|
|
name,
|
|
});
|
|
assert.equal(item.pseudocode, result.items[0].pseudocode);
|
|
}
|
|
assert.equal(result.items[3].status, "error");
|
|
assert.equal(result.items[3].procedure.status, "unknown");
|
|
assert.ok(result.items[3].procedure.error.code);
|
|
return {
|
|
entry: leaf.address,
|
|
interior,
|
|
selectors_preserved: true,
|
|
identical_resolved_code: true,
|
|
partial_failure_retained: true,
|
|
};
|
|
}
|