das-labor / panopticon

A libre cross-platform disassembler.
https://panopticon.re
GNU General Public License v3.0
1.43k stars 78 forks source link

non-deterministic dominator failure causes random panics #232

Closed m4b closed 7 years ago

m4b commented 7 years ago

So been messing around with a minimal command line main, primarily for quickly testing changes instead of going through Qt to pick a binary every time, and also to familiarize myself with other parts of the lib. Anywayyyyy, encountered this after adding the "second pass" phase, in particular the ssa_convertion call.

It seems like a pretty nasty bug; its pretty far down in the disassembler stack, all the way in another crate, which I don't know much about, emanating from this line in the graph algos library:

https://github.com/flanfly/rust-graph-algos/blob/b36558224cf42a82c274ad4d777ca311720bebed/src/dominator.rs#L89

Sometimes below completes, other times it panics with thread 'main' panicked at 'no entry found for key', /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcore/option.rs:715, the entry referring to the line above. You will likely have to run it several times before you see the bug, I recommend putting the example below in examples and running it on a larger binary, like msvcrt.dll (on the PE branch) or libc.so.6.:

cargo run --example=main -- msvcrt.dll

I don't know if its because something is semantically invalid with below, but if so, I can't see why that would be a non-deterministic failure...

Here is a minimal working main, basically copied out of project.rs from qt/src, but it doesn't suppress/catch the panic (which I suspect panopticon does, and why perhaps this wasn't caught sooner):

#[macro_use]
extern crate log;
extern crate env_logger;

extern crate panopticon;
extern crate rustc_serialize;
extern crate graph_algos;
extern crate uuid;

use panopticon::{
    Project,
    Function,
    Program,CallTarget,
    ControlFlowTarget,
    Rvalue,
    Result,
    ssa_convertion,
    Lvalue,
    Architecture,
    OpaqueLayer,
    Layer,
    Region,
    Bound,
    World,
    approximate,
    Kset,
};
use panopticon::amd64;
use panopticon::mos;
use panopticon::avr;
use panopticon::loader;

use std::collections::{
    HashMap,
    HashSet,
};
use std::fmt::Debug;

use graph_algos::{
    VertexListGraphTrait,
    MutableGraphTrait,
    GraphTrait
};

use std::env;
use std::path::Path;
use rustc_serialize::json;
use uuid::Uuid;

#[derive(Debug, Clone)]
struct Todo {
    name: String,
    uuid: Uuid,
    entry: u64,
    size: usize,
}

fn disass<A: 'static + Architecture + Debug>(project: Project, cfg: A::Configuration) -> panopticon::result::Result<()>
where A::Configuration: Debug + Sync, A::Token: Sync + Send {
    let program = &project.code[0];
    let todos = program.call_graph.vertices().filter_map(|x| {
        match program.call_graph.vertex_label(x) {
            Some (&CallTarget::Todo(Rvalue::Constant{value, size}, ref name, uuid)) => {
                let name = name.clone().unwrap_or(format!("func_{:x}", 0));
                Some(
                    Todo {
                        name: name,
                        uuid: uuid,
                        entry: value,
                        size: size,
                    })
            },
            _ => None
        }
    }).collect::<Vec<_>>();

    let root = project.data.dependencies.vertex_label(project.data.root).unwrap();

    let funcs = todos.iter().map(|ref todo | -> Result<Function> {
        let entry = todo.entry;
        println!("start new function {:?} at {:?}",&todo.uuid,entry);
        let mut func = {
            let name = todo.name.clone();
            Function::with_uuid(name, todo.uuid, root.name().clone())
        };
        func = {
            let mut func = {
                Function::disassemble::<A>(Some(func),cfg.clone(),&root,entry)
            };
            func.entry_point = func.find_basic_block_at_address(entry);
            func
        };

        if func.cflow_graph.num_vertices() == 0 || func.entry_point.is_none() {
            println!("failed to disassemble for {}", func.name);

            let uu = func.uuid.clone();
            return Err("bad".into());
        }
        println!("primary pass done");
        let mut fixpoint = func.entry_point.is_none();

       // bug comes from the ssa_convertion call
        while !fixpoint {
            fixpoint = true;
            ssa_convertion(&mut func);

            let vals = try!(approximate::<Kset>(&func));
            let vxs = { func.cflow_graph.vertices().collect::<Vec<_>>() };
            let mut resolved_jumps = HashSet::<u64>::new();

            for &vx in vxs.iter() {
                if let Some(&mut ControlFlowTarget::Unresolved(ref mut var@Rvalue::Variable{..})) = func.cflow_graph.vertex_label_mut(vx) {
                    if let Some(&Kset::Set(ref v)) = vals.get(&Lvalue::from_rvalue(var.clone()).unwrap()) {
                        if let Some(&(val,sz)) = v.first() {
                            *var = Rvalue::Constant{ value: val, size: sz };
                            fixpoint = true;
                            println!("resolved {:?} to {:?}",var,val);
                            resolved_jumps.insert(val);
                        }
                    }
                }
            }

            for addr in resolved_jumps {
                println!("continue at {:?}",addr);
                func = {
                    let root = project.data.dependencies.vertex_label(project.data.root).unwrap();
                    let mut func = {
                        Function::disassemble::<A>(Some(func),cfg.clone(),&root,addr)
                    };

                    func.entry_point = func.find_basic_block_at_address(entry);

                    func
                };
            }

            println!("secondary pass done");
        }

        Ok(func)
    }).collect::<Vec<Result<Function>>>();
    Ok(())
}

fn run(path: &str) -> panopticon::result::Result<()> {
    let (project, machine) = panopticon::loader::load(Path::new(&path))?;
    match machine {
        loader::Machine::Ia32 => disass::<amd64::Amd64>(project, amd64::Mode::Protected),
        loader::Machine::Amd64 => disass::<amd64::Amd64>(project, amd64::Mode::Long),
        loader::Machine::Avr => disass::<avr::Avr>(project, avr::Mcu::atmega88()),
    }
}

fn main () {
    env_logger::init().unwrap();
    for (i, arg) in env::args().enumerate() {
        if i == 1 {
            match run(&arg) {
                Err(err) => println!("{:?}", err),
                Ok(()) => ()
            }
        }
    }
}

If you can fix this or point out what I'm doing wrong will be very happy :)

m4b commented 7 years ago

Actually I cannot seem to repro this on libc.

So the last 4 runs consistently crashed on msvcrt.dll with an exported symbol called _HUGE, so I assumed I was mistaken; but on last run, where I added this line:

        if &todo.name == "_HUGE" { println!("{:#}", json::encode(&func).unwrap()); }

it did not crash...

start fn: _HUGE (Uuid("f0180305-5135-49d5-9ae4-126f516d1ec4")) at 0x101b6780
ERROR:panopticon::function: failed to disassemble: Internal error
ERROR:panopticon::amd64: Multiple group 2 prefixes
ERROR:panopticon::function: failed to disassemble: Internal error
ERROR:panopticon::function: failed to disassemble: Internal error
primary pass done
{"uuid":"f0180305-5135-49d5-9ae4-126f516d1ec4","name":"_HUGE","cflow_graph":{"vertices":{"6":{"variant":"Resolved","fields":[{"area":{"start":270231429,"end":270231431},"mnemonics":[{"area":{"start":270231429,"end":270231431},"opcode":"add","operands":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Variable","fields":["dh",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Variable","fields":["dh",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["dh",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["dh",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]}]}]},"2":{"variant":"Resolved","fields":[{"area":{"start":270231425,"end":270231427},"mnemonics":[{"area":{"start":270231425,"end":270231427},"opcode":"add","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]}]}]},"1":{"variant":"Resolved","fields":[{"area":{"start":270231424,"end":270231426},"mnemonics":[{"area":{"start":270231424,"end":270231426},"opcode":"add","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]}]}]},"15":{"variant":"Failed","fields":[270231557,"Unrecognized instruction"]},"8":{"variant":"Resolved","fields":[{"area":{"start":270231431,"end":270231433},"mnemonics":[{"area":{"start":270231431,"end":270231433},"opcode":"jg","operands":[{"variant":"Constant","fields":[270231417,32]}],"instructions":[],"format_string":[{"variant":"Variable","fields":[false]}]}]}]},"13":{"variant":"Failed","fields":[270231532,"Unrecognized instruction"]},"10":{"variant":"Resolved","fields":[{"area":{"start":270231453,"end":270231473},"mnemonics":[{"area":{"start":270231453,"end":270231454},"opcode":"inc","operands":[{"variant":"Variable","fields":["eax",null,0,32]}],"instructions":[],"format_string":[{"variant":"Variable","fields":[false]}]},{"area":{"start":270231454,"end":270231456},"opcode":"add","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231456,"end":270231458},"opcode":"scasb","operands":[],"instructions":[],"format_string":[]},{"area":{"start":270231458,"end":270231460},"opcode":"adc","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["dl",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["dl",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf",null,8]},"op":{"variant":"ZeroExtend","fields":[8,{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["cf",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["dl",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["dl",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231460,"end":270231462},"opcode":"add","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231462,"end":270231464},"opcode":"add","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231464,"end":270231466},"opcode":"aas","operands":[],"instructions":[],"format_string":[]},{"area":{"start":270231466,"end":270231467},"opcode":"inc","operands":[{"variant":"Variable","fields":["ecx",null,0,32]}],"instructions":[],"format_string":[{"variant":"Variable","fields":[false]}]},{"area":{"start":270231467,"end":270231468},"opcode":"push","operands":[{"variant":"Variable","fields":["esi",null,0,32]}],"instructions":[],"format_string":[{"variant":"Variable","fields":[false]}]},{"area":{"start":270231468,"end":270231471},"opcode":"arpl","operands":[{"variant":"Variable","fields":["WORD PTR [eax+0x61]",null,0,16]},{"variant":"Variable","fields":["bp",null,0,16]}],"instructions":[{"assignee":{"variant":"Variable","fields":["d",null,32]},"op":{"variant":"ZeroExtend","fields":[32,{"variant":"Constant","fields":[97,8]}]}},{"assignee":{"variant":"Variable","fields":["eax",null,32]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["eax",null,0,32]},{"variant":"Variable","fields":["d",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["WORD PTR [eax+0x61]",null,16]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231471,"end":270231473},"opcode":"jb","operands":[{"variant":"Constant","fields":[270231551,32]}],"instructions":[],"format_string":[{"variant":"Variable","fields":[false]}]}]}]},"9":{"variant":"Resolved","fields":[{"area":{"start":270231433,"end":270231453},"mnemonics":[{"area":{"start":270231433,"end":270231434},"opcode":"scasb","operands":[],"instructions":[],"format_string":[]},{"area":{"start":270231434,"end":270231436},"opcode":"adc","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["dl",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["dl",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf",null,8]},"op":{"variant":"ZeroExtend","fields":[8,{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["cf",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["dl",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["dl",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231436,"end":270231438},"opcode":"add","operands":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}],"instructions":[{"assignee":{"variant":"Variable","fields":["BYTE PTR [eax]",null,8]},"op":{"variant":"Load","fields":["ram",{"variant":"Variable","fields":["eax",null,0,32]}]}},{"assignee":{"variant":"Variable","fields":["res",null,8]},"op":{"variant":"Add","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["SF",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["ZF",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["cf1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["CF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["cf1",null,0,1]},{"variant":"Variable","fields":["cf2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["half_a",null,4]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"Equal","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af2",null,1]},"op":{"variant":"LessUnsigned","fields":[{"variant":"Variable","fields":["half_res",null,0,4]},{"variant":"Variable","fields":["half_a",null,0,4]}]}},{"assignee":{"variant":"Variable","fields":["af1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["CF",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["AF",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["af1",null,0,1]},{"variant":"Variable","fields":["af2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["s1",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s2",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["al",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["s3",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["res",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t1",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["BYTE PTR [eax]",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t2",null,1]},"op":{"variant":"LessSigned","fields":[{"variant":"Variable","fields":["al",null,0,8]},{"variant":"Constant","fields":[0,8]}]}},{"assignee":{"variant":"Variable","fields":["t3",null,1]},"op":{"variant":"LessOrEqualSigned","fields":[{"variant":"Constant","fields":[0,8]},{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["s1",null,0,1]},{"variant":"Variable","fields":["s2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov1",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["s3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["t1",null,0,1]},{"variant":"Variable","fields":["t2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["ov2",null,1]},"op":{"variant":"And","fields":[{"variant":"Variable","fields":["ov2",null,0,1]},{"variant":"Variable","fields":["t3",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["OV",null,1]},"op":{"variant":"InclusiveOr","fields":[{"variant":"Variable","fields":["ov1",null,0,1]},{"variant":"Variable","fields":["ov2",null,0,1]}]}},{"assignee":{"variant":"Variable","fields":["half_res",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["res",null,0,1]},{"variant":"Variable","fields":["res",null,1,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,2,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,3,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,4,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,5,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,6,1]}]}},{"assignee":{"variant":"Variable","fields":["PF",null,1]},"op":{"variant":"ExclusiveOr","fields":[{"variant":"Variable","fields":["PF",null,0,1]},{"variant":"Variable","fields":["half_res",null,7,1]}]}},{"assignee":{"variant":"Variable","fields":["reg",null,8]},"op":{"variant":"Move","fields":[{"variant":"Variable","fields":["res",null,0,8]}]}}],"format_string":[{"variant":"Variable","fields":[false]},{"variant":"Literal","fields":[","]},{"variant":"Literal","fields":[" "]},{"variant":"Variable","fields":[false]}]},{"area":{"start":270231438,"end":270231440},"opc

This particular run finished without error.

Also the serialized func is so large it won't fit into my clipboard or something :sob:

Regardless, here's a case where it does fail:

start fn: _HUGE (Uuid("917e68e2-ddfd-417f-b2f4-cd0140b9e508")) at 0x101b6780
ERROR:panopticon::function: failed to disassemble: Internal error
ERROR:panopticon::amd64: Multiple group 2 prefixes
ERROR:panopticon::function: failed to disassemble: Internal error
ERROR:panopticon::function: failed to disassemble: Internal error
primary pass done
thread 'main' panicked at 'no entry found for key', /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcore/option.rs:715

I dunno, I'm pretty perplexed...

EDIT: attached a successful debug run with _HUGE printed: debug.txt

EDIT2: attached a non-successful debug run with _HUGE not printed (it seems printing prevents the panic, which is terrifying TBH) debug_crash.txt

flanfly commented 7 years ago

Hey @m4b, thanks for looking into this. The error messages look like Panopticon fails to recognize some mnemonics, nothing that can't be fixed. The Heisenbug like behavior makes me a bit nervous too. The problem with the dominator tree sounds really odd. I had this kind of error when feeding it with CFGs that had multiple entry points :/

m4b commented 7 years ago

This is definitely an interaction between these two calls for a functions cfg:

    let mut cfg = &mut func.cflow_graph;
...
    let idom = immediate_dominator(func.entry_point.unwrap(),cfg);
    let df = dominance_frontiers(&idom,cfg);

I believe the non-determinism is a result of non-determinism from the iterator which visits the keys in arbitrary order in the hash map, when calling vertices, as the impl for the Cfg will be this:

return self.vertex_labels.keys().map(std::clone::Clone::clone);

Which gets called here in dominance_frontiers algorithm:

    for b in graph.vertices() {
        let pred = {
            let mut ret = graph.in_edges(b)
                               .map(|e| graph.source(e))
                               .filter(|&x| x != b)
                               .collect::<Vec<G::Vertex>>();
            ret.sort();
            ret.dedup();
            ret
        };

        if pred.len() >= 2 {
            for p in pred {
                let mut runner = p;

                while runner != idom[&b] {
                    ret.entry(runner).or_insert(vec![]).push(b);
                    // bad deref here, runner key is not an element of idom's keys
                    runner = idom[&runner];
                }
            }
        }
    }

So I think some invariant isn't being preserved in the above algorithm, and I think the following question (assuming its correctly formulated) needs an answer:

For some key/vertices, b, in the control flow graph of some function F, can the value of the key b for the immediate dominator (idom) for the entry point of F not be a key to a value in idom?

If the above is true, i.e., its possible that it isn't also a key in idom, then the above algorithm is incorrect, and needs to be checked (I don't really know what it does from a semantic viewpoint so I don't feel qualified to make the change :P)

If it isn't true, e.g., every value of any key in idom is also a key for idom, then somehow the immediate dominator wasn't computed correctly, or the cfg is somehow malformed.

m4b commented 7 years ago

I believe the following attachment, key2.txt, has all of the information necessary to determine the failure.

It contains the state of the _HUGE Function's cfg, and its idom just before the dominance frontiers computation, which some key iteration of which causes the no entry found failure.

key2.txt

This also contains a dump of a bad key for _HUGE, but doesn't include the function cfg before its mutated in phi_functions

key.txt

It should be possible to repro in a small testcase using the edge values and some dummy contents is my guess?

flanfly commented 7 years ago

Thanks @m4b! The algorithm is described in Engineering a Compiler by Cooper and Torczon. I probably made a mistake when turning the pseudo code into Rust.

Edit: The algorithm seems to be correct. The problem is that immediate_dominators is called with start set to vertex 0, but the cfg starts at vertex 1:

cfg

The basic blocks attached to vertex 0 and 1 overlap with entry. This is why entry_point is set to vertex 0. even though it should be vertex 1.

m4b commented 7 years ago

Is this still showing up? Is there a simple repro? I've tried running new patch on msvcrt.dll on _HUGE symbol and can't repro, but as noted above, can be random

flanfly commented 7 years ago

I changed the code to consider entry points when disassembling. I also added better error handling to ssa_conversion et.al. so if the problem is still there we can see what's wrong exactly.

As always, please reopen the issue if you stumble over the problem again.