Skip to content

Commit

Permalink
[language] Binary format changes
Browse files Browse the repository at this point in the history
Here are the changes to the binary format.
We have few things missing around Scripts vs Modules and around functions
(native function flags and function signatures).
However this works and it's the bulk of the binary changes.
There is more to clean up and correct but this needs to go
in asap and we can all iterate over
  • Loading branch information
Dario Russi committed Apr 1, 2020
1 parent 3188ab2 commit 45fe473
Show file tree
Hide file tree
Showing 138 changed files with 6,735 additions and 6,050 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions language/bytecode-verifier/Cargo.toml
Expand Up @@ -17,6 +17,7 @@ petgraph = "0.5.0"
borrow-graph = { path = "../borrow-graph", version = "0.0.1" }
vm = { path = "../vm", version = "0.1.0" }
libra-types = { path = "../../types", version = "0.1.0" }
move-core-types = { path = "../move-core/types", version = "0.1.0" }
move-vm-types = { path = "../move-vm/types", version = "0.1.0" }

[dev-dependencies]
Expand Down
Expand Up @@ -16,29 +16,34 @@ fn empty_module_no_errors() {
}

#[test]
fn invalid_type_param_in_fn_return_types() {
fn invalid_type_param_in_fn_return_() {
use SignatureToken::*;

let mut m = basic_test_module();
m.function_signatures[0].return_types = vec![TypeParameter(0)];
m.function_handles[0].return_ = SignatureIndex(1);
m.signatures.push(Signature(vec![TypeParameter(0)]));
assert_eq!(m.signatures.len(), 2);
m.freeze().unwrap_err();
}

#[test]
fn invalid_type_param_in_fn_arg_types() {
fn invalid_type_param_in_fn_parameters() {
use SignatureToken::*;

let mut m = basic_test_module();
m.function_signatures[0].arg_types = vec![TypeParameter(0)];
m.function_handles[0].parameters = SignatureIndex(1);
m.signatures.push(Signature(vec![TypeParameter(0)]));
m.freeze().unwrap_err();
}

#[test]
fn invalid_struct_in_fn_return_types() {
fn invalid_struct_in_fn_return_() {
use SignatureToken::*;

let mut m = basic_test_module();
m.function_signatures[0].return_types = vec![Struct(StructHandleIndex::new(1), vec![])];
m.function_handles[0].return_ = SignatureIndex(1);
m.signatures
.push(Signature(vec![Struct(StructHandleIndex::new(1))]));
m.freeze().unwrap_err();
}

Expand All @@ -47,37 +52,55 @@ fn invalid_type_param_in_field() {
use SignatureToken::*;

let mut m = basic_test_module();
m.type_signatures[0].0 = TypeParameter(0);
m.freeze().unwrap_err();
match &mut m.struct_defs[0].field_information {
StructFieldInformation::Declared(ref mut fields) => {
fields[0].signature.0 = TypeParameter(0);
m.freeze().unwrap_err();
}
_ => panic!("attempt to change a field that does not exist"),
}
}

#[test]
fn invalid_struct_in_field() {
use SignatureToken::*;

let mut m = basic_test_module();
m.type_signatures[0].0 = Struct(StructHandleIndex::new(3), vec![]);
m.freeze().unwrap_err();
match &mut m.struct_defs[0].field_information {
StructFieldInformation::Declared(ref mut fields) => {
fields[0].signature.0 = Struct(StructHandleIndex::new(3));
m.freeze().unwrap_err();
}
_ => panic!("attempt to change a field that does not exist"),
}
}

#[test]
fn invalid_struct_with_actuals_in_field() {
use SignatureToken::*;

let mut m = basic_test_module();
m.type_signatures[0].0 = Struct(StructHandleIndex::new(0), vec![TypeParameter(0)]);
m.freeze().unwrap_err();
match &mut m.struct_defs[0].field_information {
StructFieldInformation::Declared(ref mut fields) => {
fields[0].signature.0 =
StructInstantiation(StructHandleIndex::new(0), vec![TypeParameter(0)]);
m.freeze().unwrap_err();
}
_ => panic!("attempt to change a field that does not exist"),
}
}

#[test]
fn invalid_locals_id_in_call() {
use Bytecode::*;

let mut m = basic_test_module();
m.function_defs[0].code.code = vec![Call(
FunctionHandleIndex::new(0),
LocalsSignatureIndex::new(1),
)];
m.function_instantiations.push(FunctionInstantiation {
handle: FunctionHandleIndex::new(0),
type_parameters: SignatureIndex::new(1),
});
let func_inst_idx = FunctionInstantiationIndex(m.function_instantiations.len() as u16 - 1);
m.function_defs[0].code.code = vec![CallGeneric(func_inst_idx)];
m.freeze().unwrap_err();
}

Expand All @@ -87,12 +110,13 @@ fn invalid_type_param_in_call() {
use SignatureToken::*;

let mut m = basic_test_module();
m.locals_signatures
.push(LocalsSignature(vec![TypeParameter(0)]));
m.function_defs[0].code.code = vec![Call(
FunctionHandleIndex::new(0),
LocalsSignatureIndex::new(1),
)];
m.signatures.push(Signature(vec![TypeParameter(0)]));
m.function_instantiations.push(FunctionInstantiation {
handle: FunctionHandleIndex::new(0),
type_parameters: SignatureIndex::new(1),
});
let func_inst_idx = FunctionInstantiationIndex(m.function_instantiations.len() as u16 - 1);
m.function_defs[0].code.code = vec![CallGeneric(func_inst_idx)];
m.freeze().unwrap_err();
}

Expand All @@ -102,14 +126,14 @@ fn invalid_struct_as_type_actual_in_exists() {
use SignatureToken::*;

let mut m = basic_test_module();
m.locals_signatures.push(LocalsSignature(vec![Struct(
StructHandleIndex::new(3),
vec![],
)]));
m.function_defs[0].code.code = vec![Call(
FunctionHandleIndex::new(0),
LocalsSignatureIndex::new(1),
)];
m.signatures
.push(Signature(vec![Struct(StructHandleIndex::new(3))]));
m.function_instantiations.push(FunctionInstantiation {
handle: FunctionHandleIndex::new(0),
type_parameters: SignatureIndex::new(1),
});
let func_inst_idx = FunctionInstantiationIndex(m.function_instantiations.len() as u16 - 1);
m.function_defs[0].code.code = vec![CallGeneric(func_inst_idx)];
m.freeze().unwrap_err();
}

Expand Down Expand Up @@ -139,22 +163,14 @@ proptest! {
module in CompiledModule::valid_strategy(20),
oob_mutations in vec(OutOfBoundsMutation::strategy(), 0..40),
) {
let (module, mut expected_violations) = {
let (module, expected_violations) = {
let oob_context = ApplyOutOfBoundsContext::new(module, oob_mutations);
oob_context.apply()
};
expected_violations.sort();

let bounds_checker = BoundsChecker::new(&module);
let mut actual_violations = bounds_checker.verify();
actual_violations.sort();
for violation in actual_violations.iter_mut() {
violation.set_message("".to_string())
}
for violation in expected_violations.iter_mut() {
violation.set_message("".to_string())
}
prop_assert_eq!(expected_violations, actual_violations);
let actual_violations = bounds_checker.verify();
prop_assert_eq!(expected_violations.is_empty(), actual_violations.is_empty());
}

#[test]
Expand All @@ -163,22 +179,15 @@ proptest! {
mutations in vec(CodeUnitBoundsMutation::strategy(), 0..40),
) {
let mut module = module.into_inner();
let mut expected_violations = {
let expected_violations = {
let context = ApplyCodeUnitBoundsContext::new(&mut module, mutations);
context.apply()
};
expected_violations.sort();

let bounds_checker = BoundsChecker::new(&module);
let mut actual_violations = bounds_checker.verify();
actual_violations.sort();
for violation in actual_violations.iter_mut() {
violation.set_message("".to_string())
}
for violation in expected_violations.iter_mut() {
violation.set_message("".to_string())
}
prop_assert_eq!(expected_violations, actual_violations);
let actual_violations = bounds_checker.verify();

prop_assert_eq!(expected_violations.is_empty(), actual_violations.is_empty());
}

#[test]
Expand Down
Expand Up @@ -9,6 +9,6 @@ proptest! {
#[test]
fn valid_duplication(module in CompiledModule::valid_strategy(20)) {
let duplication_checker = DuplicationChecker::new(&module);
prop_assert!(!duplication_checker.verify().is_empty());
prop_assert!(duplication_checker.verify().is_empty());
}
}

0 comments on commit 45fe473

Please sign in to comment.