Skip to main content

Decompilation

Struct Decompilation 

Source
#[non_exhaustive]
pub struct Decompilation { pub nef: NefFile, pub manifest: Option<ContractManifest>, pub warnings: Vec<String>, pub instructions: Vec<Instruction>, pub cfg: Cfg, pub call_graph: CallGraph, pub xrefs: Xrefs, pub types: TypeInfo, pub pseudocode: Option<String>, pub high_level: Option<String>, pub csharp: Option<String>, pub ssa: Option<SsaForm>, }
Expand description

Result of a successful decompilation run.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§nef: NefFile

Parsed NEF container.

§manifest: Option<ContractManifest>

Optional parsed contract manifest.

§warnings: Vec<String>

Non-fatal warnings emitted during disassembly or rendering.

§instructions: Vec<Instruction>

Disassembled instruction stream from the NEF script.

§cfg: Cfg

Control flow graph built from the instruction stream.

§call_graph: CallGraph

Best-effort call graph extracted from the instruction stream.

§xrefs: Xrefs

Best-effort cross-reference information for locals/args/statics.

§types: TypeInfo

Best-effort primitive/collection type inference.

§pseudocode: Option<String>

Optional rendered pseudocode output.

§high_level: Option<String>

Optional rendered high-level output.

§csharp: Option<String>

Optional rendered C# output.

§ssa: Option<SsaForm>

SSA form of the control flow graph (computed lazily).

Implementations§

Source§

impl Decompilation

Source

pub fn cfg_to_dot(&self) -> String

Get the control flow graph as DOT format for visualization.

The DOT output can be rendered using Graphviz or similar tools.

§Example
let decompilation = decompiler.decompile_bytes(&nef_bytes)?;
let dot = decompilation.cfg_to_dot();
std::fs::write("cfg.dot", dot)?;
// Then run: dot -Tpng cfg.dot -o cfg.png
Source

pub fn ssa(&self) -> Option<&SsaForm>

Get or compute the SSA form of this decompilation.

SSA form is computed lazily on first call and cached for subsequent calls.

§Returns

Option<&SsaForm> - The SSA form, or None if CFG has no blocks.

§Examples
let decompilation = decompiler.decompile_bytes(&nef_bytes)?;
if let Some(ssa) = decompilation.ssa() {
    println!("SSA Stats: {}", ssa.stats());
    println!("{}", ssa.render());
}
Source

pub fn compute_ssa(&mut self)

Compute SSA form if not already computed.

This is a convenience method for computing SSA form lazily. After calling this, ssa() will return Some(...).

Source

pub fn ssa_stats(&self) -> Option<String>

Get SSA statistics if SSA form is available.

§Returns

Option<String> - Formatted statistics string, or None if SSA not computed.

Source

pub fn render_ssa(&self) -> Option<String>

Render SSA form if available.

§Returns

Option<String> - Rendered SSA code, or None if SSA not computed.

Trait Implementations§

Source§

impl Clone for Decompilation

Source§

fn clone(&self) -> Decompilation

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Decompilation

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.