From 3653c167ea8118b7a02de0cb5574d23c2b45c4fc Mon Sep 17 00:00:00 2001 From: salh Date: Fri, 17 Apr 2026 23:39:18 +0300 Subject: [PATCH] Fix validation unresolved calls by resolving gap-fill overlapping intervals in getFunctionContaining --- .../rexglue-sdk/src/codegen/function_graph.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/thirdparty/rexglue-sdk/src/codegen/function_graph.cpp b/thirdparty/rexglue-sdk/src/codegen/function_graph.cpp index ac5dcdd8..fb15acdd 100644 --- a/thirdparty/rexglue-sdk/src/codegen/function_graph.cpp +++ b/thirdparty/rexglue-sdk/src/codegen/function_graph.cpp @@ -807,24 +807,31 @@ bool FunctionGraph::removeFunction(uint32_t entryPoint) { } FunctionNode* FunctionGraph::getFunctionContaining(uint32_t addr) { - // O(log f) lookup via sorted base index: find last function with base <= addr + // O(k) lookup via sorted base index: search backward for a containing function auto it = functionsByBase_.upper_bound(addr); - if (it != functionsByBase_.begin()) { + while (it != functionsByBase_.begin()) { --it; if (it->second->containsAddress(addr)) { return it->second; } + // Optimization: stop searching if we are further away than any reasonable function size (16MB) + if (addr - it->first > 16 * 1024 * 1024) { + break; + } } return nullptr; } const FunctionNode* FunctionGraph::getFunctionContaining(uint32_t addr) const { auto it = functionsByBase_.upper_bound(addr); - if (it != functionsByBase_.begin()) { + while (it != functionsByBase_.begin()) { --it; if (it->second->containsAddress(addr)) { return it->second; } + if (addr - it->first > 16 * 1024 * 1024) { + break; + } } return nullptr; }