From 2c707abb66433f9065733398a0e5ea9af04cfb96 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Tue, 14 Jul 2026 04:21:28 +0800 Subject: [PATCH] fix(hopper): return addresses for procedure relationships --- bridge/hopper_bridge.py | 4 ++-- tests/bridgeTruthfulness.test.ts | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/bridge/hopper_bridge.py b/bridge/hopper_bridge.py index 0b0a85d2a..18548fac1 100644 --- a/bridge/hopper_bridge.py +++ b/bridge/hopper_bridge.py @@ -753,9 +753,9 @@ def _dispatch(method, params): if method == "procedure_pseudo_code": return procedure.decompile() if method == "procedure_callers": - return [_procedure_name(item) for item in procedure.getAllCallerProcedures()] + return sorted((_hex(item.getEntryPoint()) for item in procedure.getAllCallerProcedures()), key=lambda value: int(value, 16)) if method == "procedure_callees": - return [_procedure_name(item) for item in procedure.getAllCalleeProcedures()] + return sorted((_hex(item.getEntryPoint()) for item in procedure.getAllCalleeProcedures()), key=lambda value: int(value, 16)) if method == "procedure_info": blocks = list(procedure.basicBlockIterator()) length = sum(max(0, block.getEndingAddress() - block.getStartingAddress()) for block in blocks) diff --git a/tests/bridgeTruthfulness.test.ts b/tests/bridgeTruthfulness.test.ts index dd9ad2d02..3b16d0c27 100644 --- a/tests/bridgeTruthfulness.test.ts +++ b/tests/bridgeTruthfulness.test.ts @@ -110,4 +110,19 @@ describe("Hopper bridge truthfulness", () => { "document_closed = _session_document() is None", ); }); + + it("returns deterministic addresses for direct procedure relationships", () => { + expect(bridgeSource).toContain( + "_hex(item.getEntryPoint()) for item in procedure.getAllCallerProcedures()", + ); + expect(bridgeSource).toContain( + "_hex(item.getEntryPoint()) for item in procedure.getAllCalleeProcedures()", + ); + expect(bridgeSource).not.toContain( + "_procedure_name(item) for item in procedure.getAllCallerProcedures()", + ); + expect(bridgeSource).not.toContain( + "_procedure_name(item) for item in procedure.getAllCalleeProcedures()", + ); + }); });