Fission

Fission External Evaluation Guide

Summary

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:

Do not assume, yet:

The current recommendation is:

  1. validate the CLI first
  2. inspect one or two real decompilation outputs
  3. use the operator-oriented inventory path if you need machine-readable artifacts
  4. run the benchmark only after basic CLI success

For the full CLI reference, see CLI.md.

What Fission Is Today

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.

Capability Boundaries

Stable enough to evaluate now

Still evolving

Evaluation Sample Set

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:

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

30-Minute Evaluation Path

This is the recommended first pass.

1. Build the CLI

cargo build -p fission-cli --release

Canonical binary:

target/release/fission_cli

2. Inspect binary metadata

./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

3. List discovered functions in JSON

./target/release/fission_cli list benchmark/binary/x86-64/window/small/binary/c/test_functions.exe --json

What to inspect:

Recommended first function:

Example payload: list-test_functions.json

4. Disassemble one function

./target/release/fission_cli disasm benchmark/binary/x86-64/window/small/binary/c/test_functions.exe --addr 0x140001450 --function

What to inspect:

5. Decompile one function in text form

./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

6. Decompile the same function in JSON form

./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

7. Stop here or continue

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.

Deeper Evaluation Path

If the first pass looks promising, continue with a slightly deeper headless workflow.

Operator-grade function inventory

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.

Benchmark Evaluation

Benchmarking is stage 2, not the first external evaluation step.

Run it only after:

Canonical 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:

Why this artifact first:

For the full benchmark workflow, see benchmark/full_benchmark/README.md.

Text Output vs JSON Output

Use plain text when:

Use JSON when:

Use inventory when:

Library And Sleigh Positioning

Does Fission rely on Sleigh?

Yes.

Fission relies on Sleigh for instruction semantics and the knowledge encoded in .slaspec files.

Does the canonical path depend on Ghidra’s decompiler runtime?

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

Can teams use it as a library?

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.

Is Python binding a primary supported surface today?

No.

Treat Python binding as a future or experimental direction unless it is explicitly documented as supported in a later release.

Known Limitations

What A Successful External Evaluation Looks Like

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.