From 31673aa31d57cecee09ac370fa646e5794543014 Mon Sep 17 00:00:00 2001 From: fro Date: Tue, 19 Sep 2017 23:58:20 +0300 Subject: [PATCH] non-determinism checker initial impl wip --- Cargo.toml | 2 +- non_determinism_checker/.gitignore | 2 + non_determinism_checker/Cargo.toml | 9 +++ non_determinism_checker/src/main.rs | 26 +++++++ src/lib.rs | 4 +- src/non_determinism_checker.rs | 101 ++++++++++++++++++++++++++++ 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 non_determinism_checker/.gitignore create mode 100644 non_determinism_checker/Cargo.toml create mode 100644 non_determinism_checker/src/main.rs create mode 100644 src/non_determinism_checker.rs diff --git a/Cargo.toml b/Cargo.toml index b4944ee..544e857 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,4 +31,4 @@ path = "pack/src/main.rs" [[bin]] name = "wasm-build" -path = "build/src/main.rs" \ No newline at end of file +path = "build/src/main.rs" diff --git a/non_determinism_checker/.gitignore b/non_determinism_checker/.gitignore new file mode 100644 index 0000000..a9d37c5 --- /dev/null +++ b/non_determinism_checker/.gitignore @@ -0,0 +1,2 @@ +target +Cargo.lock diff --git a/non_determinism_checker/Cargo.toml b/non_determinism_checker/Cargo.toml new file mode 100644 index 0000000..57ed39b --- /dev/null +++ b/non_determinism_checker/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "wasm-pack" +version = "0.1.0" +authors = ["NikVolf "] + +[dependencies] +parity-wasm = "0.14" +wasm-utils = { path = "../" } +clap = "2.24" diff --git a/non_determinism_checker/src/main.rs b/non_determinism_checker/src/main.rs new file mode 100644 index 0000000..eee51bd --- /dev/null +++ b/non_determinism_checker/src/main.rs @@ -0,0 +1,26 @@ +extern crate parity_wasm; +extern crate wasm_utils; + +use std::env; + + +fn main() { + + wasm_utils::init_log(); + + let args = env::args().collect::>(); + if args.len() != 2 { + println!("Usage: {} input_file.wasm", args[0]); + return; + } + + // Loading module + let module = parity_wasm::deserialize_file(&args[1]).expect("Module deserialization to succeed"); + + if wasm_utils::have_non_determinism(module) { + println!("Yes"); + } else { + println!("No"); + } + +} diff --git a/src/lib.rs b/src/lib.rs index ea075b2..af09f6c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,9 +11,11 @@ mod symbols; mod logger; mod ext; mod pack; +mod non_determinism_checker; pub use optimizer::{optimize, Error as OptimizerError}; pub use gas::inject_gas_counter; pub use logger::init_log; pub use ext::externalize; -pub use pack::pack_instance; \ No newline at end of file +pub use pack::pack_instance; +pub use non_determinism_checker::have_non_determinism; diff --git a/src/non_determinism_checker.rs b/src/non_determinism_checker.rs new file mode 100644 index 0000000..e5bd10c --- /dev/null +++ b/src/non_determinism_checker.rs @@ -0,0 +1,101 @@ +use parity_wasm::{elements}; +use parity_wasm::elements::Section; +use parity_wasm::elements::Opcode::*; + +// TODO: +// fn check_code (FuncBodybody) -> bool { + +// } + + +pub fn have_non_determinism(module: elements::Module) -> bool { + + for section in module.sections() { + match *section { + Section::Code(ref cs) => { + for body in cs.bodies() { + for opcode in body.code().elements() { + match *opcode { + F32Abs | + F32Neg | + F32Ceil | + F32Floor | + F32Trunc | + F32Nearest | + F32Sqrt | + F32Add | + F32Sub | + F32Mul | + F32Div | + F32Min | + F32Max | + F32Copysign | + F64Abs | + F64Neg | + F64Ceil | + F64Floor | + F64Trunc | + F64Nearest | + F64Sqrt | + F64Add | + F64Sub | + F64Mul | + F64Div | + F64Min | + F64Max | + F64Copysign | + I32TruncSF32 | + I32TruncUF32 | + I32TruncSF64 | + I32TruncUF64 | + I64TruncSF32 | + I64TruncUF32 | + I64TruncSF64 | + I64TruncUF64 | + F32ConvertSI32 | + F32ConvertUI32 | + F32ConvertSI64 | + F32ConvertUI64 | + F32DemoteF64 | + F64ConvertSI32 | + F64ConvertUI32 | + F64ConvertSI64 | + F64ConvertUI64 | + F64PromoteF32 | + I32ReinterpretF32 | + I64ReinterpretF64 | + F32ReinterpretI32 | + F64ReinterpretI64 | + F32Eq | + F32Ne | + F32Lt | + F32Gt | + F32Le | + F32Ge | + F64Eq | + F64Ne | + F64Lt | + F64Gt | + F64Le | + F64Ge + => { + return true + }, + _ => continue + } + } + }; + return false; + }, + _ => continue + } + } + false +} + +#[cfg(test)] +mod tests { + use parity_wasm::{builder, elements}; + use super::*; + +}