This guide is the canonical external evaluation path for Fission.
It is written for teams evaluating Fission in a headless workflow from the CLI, without depending on the desktop UI or internal contributor documentation.
Today, the best-supported evaluation surface is:
fission_cliDo not assume, yet:
The current recommendation is:
For the full CLI reference, see CLI.md.
Fission is a Rust-native decompilation pipeline built around Sleigh-based instruction semantics, Rust-owned p-code/NIR/HIR normalization, graph-based structuring, and pseudocode rendering.
The most mature product surface today is the CLI. Rust crate integration is possible, but the external product story is still CLI-first rather than library-first.
The recommended first-run sample surface in this checkout is:
This directory is checked into the repository and is the preferred external evaluation set for this guide.
Recommended starter binaries:
binary/c/test_functions.exe
info/list/decomp runbinary/c/structs_and_pointers.exe
binary/c/bitops_and_control_flow.exe
binary/c/function_pointers_and_strings.exe
binary/c/math_operations.exe
binary/c/array_operations.exe
If the compiled binaries are not present in your checkout, build them first:
cd benchmark/binary/x86-64/window/small
./build.sh c
If you want the full multi-language set:
cd benchmark/binary/x86-64/window/small
./build.sh all
The example commands below assume this binary exists:
benchmark/binary/x86-64/window/small/binary/c/test_functions.exe
This is the recommended first pass.
cargo build -p fission-cli --release
Canonical binary:
target/release/fission_cli
./target/release/fission_cli info benchmark/binary/x86-64/window/small/binary/c/test_functions.exe
What to inspect:
Example payload: info-test_functions.txt
./target/release/fission_cli list benchmark/binary/x86-64/window/small/binary/c/test_functions.exe --json
What to inspect:
Recommended first function:
0x140001450 (add)Example payload: list-test_functions.json
./target/release/fission_cli disasm benchmark/binary/x86-64/window/small/binary/c/test_functions.exe --addr 0x140001450 --function
What to inspect:
./target/release/fission_cli decomp benchmark/binary/x86-64/window/small/binary/c/test_functions.exe --addr 0x140001450
What to inspect:
Example payload: decomp-add.txt
./target/release/fission_cli decomp benchmark/binary/x86-64/window/small/binary/c/test_functions.exe --addr 0x140001450 --json
What to inspect:
Example payload: decomp-add.json
If the first six steps succeed, you already have enough signal to judge:
Move to benchmark evaluation only after this basic CLI path works cleanly.
If the first pass looks promising, continue with a slightly deeper headless workflow.
Use the operator path when you want whole-binary machine-readable artifacts rather than one-function text output:
./target/release/fission_cli inventory function-facts \
benchmark/binary/x86-64/window/small/binary/c/test_functions.exe \
--functions-limit 1 \
--output-jsonl /tmp/fission_rows.jsonl \
--summary-json /tmp/fission_summary.json
What this demonstrates:
Example summary payload: inventory-function-facts-summary.json
Use inventory when you want structured artifacts for automation, not when you want a quick human-facing one-function decompilation result.
Benchmarking is stage 2, not the first external evaluation step.
Run it only after:
info, list, and decomp work on at least one sample binaryCanonical benchmark entrypoint:
python3 benchmark/full_benchmark/full_decomp_benchmark.py --help
One canonical corpus command:
python3 benchmark/full_benchmark/full_decomp_benchmark.py \
--corpus-manifest benchmark/config/benchmark_corpus/smoke_corpus.json \
--ghidra-dir /path/to/ghidra
What it compares:
First artifact to read:
benchmark_compact_summary.jsonWhy this artifact first:
For the full benchmark workflow, see benchmark/full_benchmark/README.md.
Use plain text when:
Use JSON when:
Use inventory when:
Yes.
Fission relies on Sleigh for instruction semantics and the knowledge encoded in .slaspec files.
No.
The lift path is Sleigh-based, but the post-lift pipeline is Rust-native:
Sleigh spec -> Fission lift to p-code -> Rust-native NIR/HIR -> structuring/rendering
Yes, at the Rust crate level.
That said, the most mature supported product surface today is still the CLI, not a stable public library API contract.
No.
Treat Python binding as a future or experimental direction unless it is explicitly documented as supported in a later release.
docs/examples/cli/ are curated payload excerpts. They preserve current field names but omit many low-signal fields for readability. Your live run may include additional preamble lines such as local config notices.An evaluator should be able to answer all of these without maintainer help:
If the answer is yes to those questions, the external evaluation pack is doing its job.