mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #2326] [Bug] Callee and caller reads give no warning when Ghidra's function body stops short #770
Closed
opened 2026-10-15 18:28:11 +00:00 by bsakaguchi
·
2 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#770
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @CassieFox23 on GitHub (Oct 12, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/2326
TL;DR: When Ghidra's function body stops short, the callee and caller reads give no warning. In OpenMW 0.51.0 (GPL-3.0), 22 of 50 checked functions lost real calls, though 20 were picked for losing the most. All 100 reads said
completewith no note, and I am not asking to change that word, only to tell the reader.What I ran
I ran the Ghidra provider over MCP on a stripped copy of
esmtool.x86_64from OpenMW 0.51.0, on main0365454a5. An earlier run on69e097a8c(#2026) gave the same results, so no recent commit changed this. The fold below says how I picked the 50 functions.The smallest example
The function is
boost::wrapexcept<boost::bad_any_cast>::rethrow()at0x112cc0. Ghidra loads this file at 0x100000, so the file address is0x12cc0.0x112cc0to0x112d63.procedure_calleesreturns 2 callees. The code makes 5 direct calls.0x112d6f,0x112d77and0x112d7f. They sit in the block that starts at0x112d64, just past the body.0x112d64as a landing pad. A landing pad is a spot that only the C++ unwinder jumps to.complete, lists four generic limitations, and says nothing about the body.procedure_infohas one terminal-call line, for the call at0x112d57. That call is inside the body. It does not explain the lost block.trace_call_pathfrom0x112cc0to0x112930(__cxa_free_exception) saysnot_reached,truncated: false, and no unknowns. The real call to it is at0x112d77.Counts
completeprocedure_infolistsretorjmp, and no view lists it22 of 50 is not a rate, since 20 were picked for losing the most. In the earlier whole-file run, 391 of 1,995 functions had at least one missing call.
Callers have the same gap, and a read on the target can't see it. For 10 targets,
procedure_callersleft out a real caller, and all 10 replies saidcompletewith no note.How I picked the functions, and more on the counts
69e097a8c(#2026).0x1dd750has 2 real direct callers, and REA returned none.What the docs say
docs/tool-design.md, lines 60 to 64, says thatcomplete"means that set was returned without a known read limit". It also says that provider and execution caveats "stay inlimitations". So the wordcompleteis by design, and a caveat belongs inlimitations.docs/ghidra-provider.md, lines 58 to 67, says an inferred no-return call "can terminate that body before subsequent bytes". It lists the views that report this: pseudocode, assembly, procedure info, instruction windows and dossiers. Callers and callees are not on that list. In the bridge,procedureCalls(line 721 ofbridge/ghidra/ReaGhidraBridge.java) returns a bare list and does not callnoReturnCallLimitations.procedureInfodoes. I only read this; I changed nothing.What I ask
limitationsfits andcompletecan stay. If you read "known read limit" as covering this,partialfits too. Insrc/application/CallPathTracing.ts,trace_call_pathonly turnsunknownonpartialorunknowncoverage. So a note inlimitationsalone will not changenot_reached. I read that code; I did not run it.procedure_info.A kind no is fine. I know the design doc keeps caveats out of coverage on purpose.
Related: my earlier issue #1658 asked for this warning, and
69a8b3a95added it to five views. Callers and callees were left out. #2222 and #2223 are about readers who trust an incomplete label. This report is about whether the label has a warning to read.Not run
0365454a5. I ran the 50 functions only.npm run verify:ghidra.compare_functions,verify_reconstructionandbuild_call_path.Thanks, morluto, for the notes in
69a8b3a95. They made this easy to chase.Table of the 50 functions
The Symbol, Body, Real and Got columns are the same on
69e097a8cand0365454a5. The Terminal column was kept for 30 functions only. It matches there. S is a function from the spread sample. T is one of the 20 with the most missing calls. Symbol is the size in the symbol table, in bytes. Body is the size of Ghidra's body, in bytes. Real is the count of direct calls in the function's own symbol range, found with objdump on the unstripped file. Got is the count of callees REA returned. Terminal is the count of terminal-call lines inprocedure_info.0x112cc00x12a8900x12f0f00x1301200x132c500x1390900x13e4800x150ba00x1586d00x158b400x158f200x15aab00x15f2b00x16bd100x16fe900x1756700x17a7700x180cf00x18c2b00x1948600x19c2c00x1a73600x1accb00x1bab400x1c93300x1d36f00x1de6000x1e63d00x1ea4900x1f67d00x14a0000x122ff00x115fb00x122dae0x124a430x11f06c0x120dc60x11d8a00x1228de0x123da20x123edc0x1133b20x115d090x11a9480x12031c0x116d4c0x1192960x11a1f40x11cf160x122c9eEarlier run, whole file
These numbers are from the earlier run on
69e097a8c. I did not repeat them on0365454a5. Recall is the share of real calls that REA returned. Precision is the share of returned calls that are real.Commands
gh api repos/morluto/rea/branches/main --jq .commit.shanpm ci,npm run build,npm run test:preparestrip --strip-all esmtool.x86_64systemd-run --user --scope -p MemoryMax=8G -- node mcp_client.mjsopen_binary,procedure_info,procedure_callees,procedure_callers,get_call_graph,trace_call_pathobjdump -d --no-show-raw-insn -j .text -j .plt -j .plt.gotlsda_check.pyandlsda_all.py, using pyelftoolsThe run was one MCP session with 168 tool calls.
open_binarytookprovider_idset toghidra. The Node line in Test setup is the version that built and ran REA.Test setup
0365454a5/69e097a8c(#2026)esmtool.x86_64from the OpenMW 0.51.0 Linux tarball (GPL-3.0); stripped copy sha25668510563bcb9026f0554712307be115d56d3e3f7167968df3b832886f28ff585🤖 Generated with Claude Code (Sonnet 5.5, verified by Opus 5.5) 🦊
@matbrgz commented on GitHub (Oct 12, 2026):
Triage & Implementation Review
Reporting complete coverage when Ghidra's decompiler or auto-analysis delineates a truncated function body misleads agent reasoning by hiding real call edges.
fix(ghidra): warn when callee/caller reads stop at a truncated function body).@destinal commented on GitHub (Oct 21, 2026):
A likely root cause on the Ghidra side, for anyone who lands here. I couldn't check it against your binary, but it matches both causes in this report.
Ghidra 12.1.x mis-decodes
.gcc_except_tablefor ELF images that the loader rebased, such as a PIE at the default0x100000.GccExceptionAnalyzerputs every call-site start and landing pad at its true address plus the image-base adjustment (filed as https://github.com/NationalSecurityAgency/ghidra/issues/9979). The effects:memcpy) as no-return and ending bodies early at those calls (cause A). Your listed terminal callees would be worth checking for that.Function body does not contain the landing pad (LSDACallSiteTable)andFailed to disassemble at … (GccExceptionAnalyzer).The
0x112cc0addresses in this report suggest a rebased PIE at0x100000, which is the affected case.Workaround: import with the image base equal to the ELF's (headless
-loader ElfLoader -loader-imagebase 0; same option in the GUI import dialog). The adjustment is then 0. Ghidra master appears to fix it inb23a95e1e(GP-6913), but that hasn't reached a 12.1.x release yet. So the provider might want to import PIEs at their ELF base, or note this limitation, until a patched release is out.