Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cpp/examples/cfg_analysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// Find first function
auto funcs = client->ListFunctions(0, UINT64_MAX, 1, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 1, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
std::cerr << "No functions found.\n";
return 1;
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/comments.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// Find first function to get a valid address
auto funcs = client->ListFunctions(0, UINT64_MAX, 1, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 1, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
std::cerr << "No functions found.\n";
return 1;
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/decompile_tokens.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n";

// Find first non-trivial function
auto funcs = client->ListFunctions(0, UINT64_MAX, 20, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 20, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
std::cerr << "No functions found.\n";
return 1;
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/disassemble.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// Find the first function
auto funcs = client->ListFunctions(0, UINT64_MAX, 1, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 1, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
std::cerr << "No functions found.\n";
return 1;
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/end_to_end.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
// ---------------------------------------------------------------------------

static void analyze(ghidra::Client& client) {
auto funcs_resp = client.ListFunctions(0, UINT64_MAX, 0, 0);
auto funcs_resp = client.ListFunctions(0, INT64_MAX, 0, 0);
if (!funcs_resp.ok()) {
fprintf(stderr, "ListFunctions failed: %s\n",
funcs_resp.status.message.c_str());
Expand Down
4 changes: 2 additions & 2 deletions cpp/examples/function_signatures.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// Find first function
auto funcs = client->ListFunctions(0, UINT64_MAX, 1, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 1, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
std::cerr << "No functions found.\n";
return 1;
Expand Down Expand Up @@ -84,7 +84,7 @@ int main(int argc, char* argv[]) {
}

// --- List all function signatures ---
auto sigs = client->ListFunctionSignatures(0, UINT64_MAX, 10, 0);
auto sigs = client->ListFunctionSignatures(0, INT64_MAX, 10, 0);
if (sigs.ok()) {
std::cout << "\nAll signatures (first " << sigs.value->signatures.size() << "):\n";
for (const auto& s : sigs.value->signatures) {
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/function_tags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ int main(int argc, char* argv[]) {
}

// 4. Tag first two functions
auto funcs = client->ListFunctions(0, UINT64_MAX, 2, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 2, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
fprintf(stderr, "ListFunctions failed or empty\n");
return 1;
Expand Down
6 changes: 3 additions & 3 deletions cpp/examples/headless_cookbook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ static bool verify_connection(ghidra::Client& c) {
static void list_functions(ghidra::Client& c) {
print_separator("Functions");

auto resp = c.ListFunctions(0, UINT64_MAX, 0, 0);
auto resp = c.ListFunctions(0, INT64_MAX, 0, 0);
if (!resp.ok()) {
fprintf(stderr, "ListFunctions: %s\n", resp.status.message.c_str());
return;
Expand Down Expand Up @@ -94,7 +94,7 @@ static void list_functions(ghidra::Client& c) {
static void decompile_first(ghidra::Client& c) {
print_separator("Decompilation (first function)");

auto resp = c.ListFunctions(0, UINT64_MAX, 1, 0); // page_size=1
auto resp = c.ListFunctions(0, INT64_MAX, 1, 0); // page_size=1
if (!resp.ok() || resp.value->functions.empty()) {
printf(" (no functions to decompile)\n");
return;
Expand Down Expand Up @@ -125,7 +125,7 @@ static void decompile_first(ghidra::Client& c) {
static void rename_demo(ghidra::Client& c) {
print_separator("Rename demo");

auto resp = c.ListFunctions(0, UINT64_MAX, 1, 0);
auto resp = c.ListFunctions(0, INT64_MAX, 1, 0);
if (!resp.ok() || resp.value->functions.empty()) {
printf(" (no functions to rename)\n");
return;
Expand Down
4 changes: 2 additions & 2 deletions cpp/examples/list_xrefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,15 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// List all functions first
auto funcs = client->ListFunctions(0, UINT64_MAX, 0, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 0, 0);
if (!funcs.ok()) {
std::cerr << "ListFunctions failed: " << funcs.status.message << "\n";
return 1;
}
std::cout << "Found " << funcs.value->functions.size() << " functions\n\n";

// Get xrefs across the entire address space
auto xrefs = client->ListXrefs(0, UINT64_MAX, 0, 0);
auto xrefs = client->ListXrefs(0, INT64_MAX, 0, 0);
if (!xrefs.ok()) {
std::cerr << "ListXrefs failed: " << xrefs.status.message << "\n";
return 1;
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/parallel_headless.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ static InstanceResult analyze_instance(const std::string& label,
status.value->service_name.c_str(),
status.value->service_version.c_str());

auto funcs = h->ListFunctions(0, UINT64_MAX, 0, 0);
auto funcs = h->ListFunctions(0, INT64_MAX, 0, 0);
if (!funcs.ok()) {
result.error = "ListFunctions: " + funcs.status.message;
h.close(false);
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/quickstart.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ int main(int argc, char* argv[]) {
}

// 3. List the first 10 functions
auto funcs = client->ListFunctions(0, UINT64_MAX, 10, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 10, 0);
if (!funcs.ok()) {
fprintf(stderr, "ListFunctions failed: %s\n",
funcs.status.message.c_str());
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/structural_analysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// Find first function
auto funcs = client->ListFunctions(0, UINT64_MAX, 1, 0);
auto funcs = client->ListFunctions(0, INT64_MAX, 1, 0);
if (!funcs.ok() || funcs.value->functions.empty()) {
std::cerr << "No functions found.\n";
return 1;
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/symbols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ int main(int argc, char* argv[]) {
std::cout << "Loaded: " << open_result.value->program_name << "\n\n";

// --- List symbols ---
auto syms = client->ListSymbols(0, UINT64_MAX, 20, 0);
auto syms = client->ListSymbols(0, INT64_MAX, 20, 0);
if (!syms.ok()) {
std::cerr << "ListSymbols failed: " << syms.status.message << "\n";
return 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,11 @@ public DecompilerContract.ListDecompilationsResponse listDecompilations(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new DecompilerContract.ListDecompilationsResponse(List.of());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,11 @@ public FunctionsContract.ListFunctionsResponse listFunctions(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new FunctionsContract.ListFunctionsResponse(List.of());
}
Expand Down Expand Up @@ -190,15 +186,11 @@ public FunctionsContract.ListBasicBlocksResponse listBasicBlocks(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) {
startOff = defaultStart;
}
if (endOff <= 0) {
endOff = defaultEnd;
}
int offset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down Expand Up @@ -251,15 +243,11 @@ public FunctionsContract.ListCFGEdgesResponse listCFGEdges(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) {
startOff = defaultStart;
}
if (endOff <= 0) {
endOff = defaultEnd;
}
int offset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down Expand Up @@ -461,11 +449,9 @@ public FunctionsContract.ListSwitchTablesResponse listSwitchTables(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) { startOff = defaultStart; }
if (endOff <= 0) { endOff = defaultEnd; }
int pOffset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down Expand Up @@ -540,11 +526,9 @@ public FunctionsContract.ListDominatorsResponse listDominators(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) { startOff = defaultStart; }
if (endOff <= 0) { endOff = defaultEnd; }
int pOffset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down Expand Up @@ -587,11 +571,9 @@ public FunctionsContract.ListPostDominatorsResponse listPostDominators(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) { startOff = defaultStart; }
if (endOff <= 0) { endOff = defaultEnd; }
int pOffset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down Expand Up @@ -636,11 +618,9 @@ public FunctionsContract.ListLoopsResponse listLoops(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) { startOff = defaultStart; }
if (endOff <= 0) { endOff = defaultEnd; }
int pOffset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,11 @@ public ListingContract.ListInstructionsResponse listInstructions(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new ListingContract.ListInstructionsResponse(List.of());
}
Expand Down Expand Up @@ -123,15 +119,11 @@ public ListingContract.GetCommentsResponse getComments(ListingContract.GetCommen
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new ListingContract.GetCommentsResponse(List.of());
}
Expand Down Expand Up @@ -379,15 +371,11 @@ public ListingContract.ListDataItemsResponse listDataItems(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new ListingContract.ListDataItemsResponse(List.of());
}
Expand Down Expand Up @@ -450,15 +438,11 @@ public ListingContract.ListBookmarksResponse listBookmarks(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new ListingContract.ListBookmarksResponse(List.of());
}
Expand Down Expand Up @@ -597,15 +581,11 @@ public ListingContract.ListBreakpointsResponse listBreakpoints(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOffset = request != null ? request.rangeStart() : defaultStart;
long endOffset = request != null ? request.rangeEnd() : defaultEnd;
long endOffset = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOffset <= 0) {
startOffset = defaultStart;
}
if (endOffset <= 0) {
endOffset = defaultEnd;
}
if (endOffset < startOffset) {
return new ListingContract.ListBreakpointsResponse(List.of());
}
Expand Down Expand Up @@ -849,15 +829,11 @@ public ListingContract.ListDefinedStringsResponse listDefinedStrings(
}
try {
long defaultStart = program.getMinAddress().getOffset();
long defaultEnd = program.getMaxAddress().getOffset();
long startOff = request != null ? request.rangeStart() : defaultStart;
long endOff = request != null ? request.rangeEnd() : defaultEnd;
long endOff = resolveRangeEnd(request != null ? request.rangeEnd() : 0);
if (startOff <= 0) {
startOff = defaultStart;
}
if (endOff <= 0) {
endOff = defaultEnd;
}
int offset = request != null ? Math.max(0, request.offset()) : 0;
int limit = request != null && request.limit() > 0 ? request.limit() : 4096;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ protected static Address toAddress(Program program, long offset) {
}
}

/**
* Normalize a "list" RPC's range-end offset, treating a non-positive value as unbounded.
*
* <p>The C++ client encodes an unbounded upper bound as the protobuf {@code uint64}
* {@code UINT64_MAX}, which is decoded here into a signed Java {@code long} as {@code -1}.
* Earlier code fell back to {@code program.getMaxAddress().getOffset()} for any
* non-positive end; for programs whose maximum address lives in a low-offset space (an
* EXTERNAL block, or file-backed "OTHER" sections at offset 0) that collapsed the scan
* window and made range-filtered tables return no rows. Treating it as
* {@link Long#MAX_VALUE} keeps the scan unbounded. See ghidrasql #2/#3/#6.
*/
protected static long resolveRangeEnd(long requestedEnd) {
return requestedEnd <= 0 ? Long.MAX_VALUE : requestedEnd;
}

protected static void writeBytesForceWritable(Program program, Address address, byte[] data)
throws MemoryAccessException {
Memory memory = program.getMemory();
Expand Down
Loading
Loading