Oxidizer-Eval

April 17, 2026 ยท View on GitHub

Evaluation framework for Oxidizer, a Rust decompiler built on top of angr. This framework benchmarks Oxidizer against state-of-the-art decompilers on real-world Rust binaries, measuring conciseness, fidelity, and type recovery.

Publication

Oxidizer: Toward Concise and High-fidelity Rust Decompilation Yibo Liu, Zion Leonahenahe Basque, Arvind S Raj, Chavin Udomwongsa, Chang Zhu, Jie Hu, Changyu Zhao, Fangzhou Dong, Adam Doupe, Tiffany Bao, Yan Shoshitaishvili, Ruoyu Wang IEEE Symposium on Security and Privacy (S&P), 2026. (To appear)

@inproceedings{liu2026oxidizer,
  title={Oxidizer: Toward Concise and High-fidelity Rust Decompilation},
  author={Liu, Yibo and Basque, Zion Leonahenahe and Raj, Arvind S and Udomwongsa, Chavin and Zhu, Chang and Hu, Jie and Zhao, Changyu and Dong, Fangzhou and Doup{\'e}, Adam and Bao, Tiffany and Shoshitaishvili, Yan and Wang, Ruoyu},
  booktitle={2026 IEEE Symposium on Security and Privacy (SP)},
  year={2026},
  organization={IEEE}
}

Decompilers

The framework currently evaluates the following decompilers:

DecompilerTypeNotes
OxidizerOpen-sourceRust-oriented decompiler built on top of angr
angrOpen-sourceVanilla angr
IDA Pro 9.0CommercialHex-Rays decompiler
Ghidra 11.2.1Open-sourceNSA's reverse engineering framework
Binary Ninja 5.3.9117-devCommercialC and Pseudo-Rust output modes

Evaluation Targets

Targets are defined in misc/targets-nightly-2025-05-22.toml. The current benchmark suite includes 28 real-world Rust projects:

TargetDescription
rustdeskRemote desktop software
uv, ruffAstral Python tooling
sway, fuel-core, fuels-rsFuel Labs blockchain ecosystem
alacrittyGPU-accelerated terminal
meilisearchSearch engine
ripgrep, fd, batCLI utilities
starshipCross-shell prompt
helix, lapceText editors
nushell, fish-shellShells
typstTypesetting system
vaultwardenBitwarden server
firecrackerMicroVM
influxdbTime-series database
surrealdbMulti-model database
turborepo, swcJavaScript tooling
sniffnet, zoxide, justVarious utilities
linera-protocolBlockchain protocol
coreutils102 GNU coreutils reimplemented in Rust

Each target is compiled at multiple optimization levels (O0-O3, Os, Oz) and stripped before decompilation.

Metrics

Conciseness

  • CC -- Cyclomatic Complexity
  • LoC -- Lines of Code
  • # Variables -- Number of unique variables
  • # Operators -- Number of operators

Fidelity

  • # Gotos -- Unstructured control flow (lower is better)
  • # Matched String Literals -- Recovered string constants
  • # Matched Function Calls -- Correctly identified function calls
  • # Extraneous Function Calls -- Extraneous function calls
  • # Matched Macro Calls -- Correctly identified Rust macro calls (e.g., println!, format!)

Type Recovery

  • Per-type precision/recall/F1 for primitives, structs, enums, Rust-specific types (Option, Result), and pointer variants

Project Structure

oxidizer-eval/
  eval.py                     # Main evaluation entry point
  config.yml                  # Runtime config (decompilers, timeouts, paths)
  eval/
    config.py                 # Configuration (decompiler list, paths, targets)
    result.py                 # Data structures (DecompileResult, EvalResult)
    decompilers/              # Decompiler adapters (unified interface)
    metrics/                  # Metric definitions and calculations
    utils/                    # Timeout, scheduling, logging
  misc/
    ground_truth_parser/      # Rust tool: extracts ground truth from source
    dwarf_parser/             # Rust tool: extracts DWARF info
    targets-*.toml            # Target definitions per toolchain
  scripts/                    # Analysis, comparison, and utility scripts

Setup

Prerequisites

  • Python >= 3.10
  • Rust nightly toolchain (nightly-2025-05-22)
  • Install Binary Ninja and its APIs
  • External decompilers placed in tools/ (IDA Pro, Ghidra)

Install Oxidizer

See instructions at Oxidizer.

Download Evaluation Targets

Download binaries and ground truth from DropBox.

Usage

Run Evaluation

python eval.py [targets] [--workers N]
ArgumentDefaultDescription
targetsallWhich targets to decompile: all, coreutils, or a specific binary name (e.g. fmt)
--workers N16Number of worker processes (<=0 to disable multiprocessing)

The evaluation pipeline:

  1. Loads target functions from ground truth
  2. Schedules decompilation tasks across all binary/decompiler combinations
  3. Runs decompilers in parallel with configurable timeouts and memory limits
  4. Computes metrics by comparing outputs against ground truth
  5. Generates HTML reports and LaTeX tables

Results are saved to output/result/<tag>/<decompiler>/<binary>/.

Configuration

Edit config.yml to configure which decompilers to run, per-decompiler timeouts and caching behavior, and tool paths.

Additional constants (e.g., coreutils module list) can be adjusted in eval/config.py.