From e02dae30a36a730620740bea195bb8eeba40d8bd Mon Sep 17 00:00:00 2001 From: blasty Date: Sun, 26 Jul 2026 20:35:41 +0200 Subject: decomp: say the FIX, not the diagnosis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 64-bit failure now reported Hex-Rays verbatim — "only 64-bit functions can be decompiled in the current database" — with the actionable half appended after it. A status bar cuts off the end, so the user got a perfect description of their problem and nothing about what to do, which is the same dead end as before with extra words. before: sub_0: cannot decompile — only 64-bit functions can be decompiled in the current database — Ctrl+L and pick arm:ARMv7-A (125 chars) after: sub_0: cannot decompile — this database is 64-bit — Ctrl+L, pick arm:ARMv7-A (76 chars) For this one failure the instruction IS the whole message: it can't be fixed in place (bitness is decided at load), so describing the database serves nobody. Other Hex-Rays reasons still pass through verbatim — they're usually about the function, and there the description is the useful part. Verified the whole path in a live pane on experiments/fibonacci.bin: the load dialog now shows arm vs arm:ARMv7-A/M/v6-M/v5TE with their bitness spelled out, picking arm:ARMv7-A gives 54 functions, and sub_0 decompiles: void __fastcall __noreturn sub_0(int a1) { ... v2 = sub_E3C(a1, 0); ... } tests: thumb (16) now asserts the message names the fix rather than quoting Hex-Rays, and that it fits under 110 chars — the truncation is what made the last version useless, so it's worth a check. 209/0 scenarios, 30/0 blob. --- tests/test_thumb_ui.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/test_thumb_ui.py b/tests/test_thumb_ui.py index 5b6f18e..84afcaf 100644 --- a/tests/test_thumb_ui.py +++ b/tests/test_thumb_ui.py @@ -161,10 +161,16 @@ async def run() -> int: await wait(lambda: "cannot decompile" in str(app.query_one("#status", Static).render()), pilot, 90) status = str(app.query_one("#status", Static).render()) - check("a failed decompile says why, in Hex-Rays' own words", - "only 64-bit functions" in status, status[:130]) + # The message must say what to DO. Hex-Rays' own sentence ("only 64-bit + # functions can be decompiled in the current database") describes the + # database, not the fix, and is long enough that a status bar cuts off + # the end — which is where an appended hint would have lived. + check("a failed decompile names the fix, not just the diagnosis", + "Ctrl+L" in status and "ARMv7-A" in status, status[:130]) check("and the reason survives the view reloading under it", "cannot decompile" in status, status[:130]) + check("the message fits a narrow status bar", + len(status) < 110, f"{len(status)} chars: {status[:130]}") # -- the whole point: a 32-bit database decompiles ---------------------- # for ext in (".i64", ".id0", ".id1", ".id2", ".nam", ".til"): -- cgit v1.3.1-sl0p