mirror of https://github.com/status-im/evmc.git
Merge pull request #314 from ethereum/rust-memleak
Rust: Fix leaks in unit tests
This commit is contained in:
commit
98f43fd9b8
|
@ -353,6 +353,20 @@ mod tests {
|
||||||
assert!(r.get_create_address().is_none());
|
assert!(r.get_create_address().is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test-specific helper to dispose of execution results in unit tests
|
||||||
|
extern "C" fn test_result_dispose(result: *const ffi::evmc_result) {
|
||||||
|
unsafe {
|
||||||
|
if !result.is_null() {
|
||||||
|
let owned = *result;
|
||||||
|
Vec::from_raw_parts(
|
||||||
|
owned.output_data as *mut u8,
|
||||||
|
owned.output_size,
|
||||||
|
owned.output_size,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn from_ffi() {
|
fn from_ffi() {
|
||||||
let f = ffi::evmc_result {
|
let f = ffi::evmc_result {
|
||||||
|
@ -360,7 +374,7 @@ mod tests {
|
||||||
gas_left: 1337,
|
gas_left: 1337,
|
||||||
output_data: Box::into_raw(Box::new([0xde, 0xad, 0xbe, 0xef])) as *const u8,
|
output_data: Box::into_raw(Box::new([0xde, 0xad, 0xbe, 0xef])) as *const u8,
|
||||||
output_size: 4,
|
output_size: 4,
|
||||||
release: None,
|
release: Some(test_result_dispose),
|
||||||
create_address: ffi::evmc_address { bytes: [0u8; 20] },
|
create_address: ffi::evmc_address { bytes: [0u8; 20] },
|
||||||
padding: [0u8; 4],
|
padding: [0u8; 4],
|
||||||
};
|
};
|
||||||
|
@ -501,6 +515,14 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper to safely dispose of the dummy context, and not bring up false positives in the
|
||||||
|
// sanitizers.
|
||||||
|
fn dummy_context_dispose(context: ffi::evmc_context) {
|
||||||
|
unsafe {
|
||||||
|
Box::from_raw(context.host as *mut ffi::evmc_host_interface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn get_dummy_message() -> ffi::evmc_message {
|
fn get_dummy_message() -> ffi::evmc_message {
|
||||||
ffi::evmc_message {
|
ffi::evmc_message {
|
||||||
kind: ffi::evmc_call_kind::EVMC_CALL,
|
kind: ffi::evmc_call_kind::EVMC_CALL,
|
||||||
|
@ -520,10 +542,14 @@ mod tests {
|
||||||
fn execution_context() {
|
fn execution_context() {
|
||||||
let msg = get_dummy_message();
|
let msg = get_dummy_message();
|
||||||
let mut context_raw = get_dummy_context();
|
let mut context_raw = get_dummy_context();
|
||||||
let mut exe_context = ExecutionContext::new(&msg, &mut context_raw);
|
// Make a copy here so we don't let get_dummy_context() go out of scope when called again
|
||||||
|
// in get_dummy_tx_context() and cause LLVM
|
||||||
|
// sanitizers to complain
|
||||||
|
let mut context_raw_copy = context_raw.clone();
|
||||||
|
|
||||||
|
let mut exe_context = ExecutionContext::new(&msg, &mut context_raw);
|
||||||
let a = exe_context.get_tx_context();
|
let a = exe_context.get_tx_context();
|
||||||
let b = unsafe { get_dummy_tx_context(&mut get_dummy_context() as *mut ffi::evmc_context) };
|
let b = unsafe { get_dummy_tx_context(&mut context_raw_copy as *mut ffi::evmc_context) };
|
||||||
|
|
||||||
assert_eq!(a.block_gas_limit, b.block_gas_limit);
|
assert_eq!(a.block_gas_limit, b.block_gas_limit);
|
||||||
assert_eq!(a.block_timestamp, b.block_timestamp);
|
assert_eq!(a.block_timestamp, b.block_timestamp);
|
||||||
|
@ -538,6 +564,8 @@ mod tests {
|
||||||
assert_eq!(c.gas, d.gas);
|
assert_eq!(c.gas, d.gas);
|
||||||
assert_eq!(c.input_data, d.input_data);
|
assert_eq!(c.input_data, d.input_data);
|
||||||
assert_eq!(c.input_size, d.input_size);
|
assert_eq!(c.input_size, d.input_size);
|
||||||
|
|
||||||
|
dummy_context_dispose(context_raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -553,5 +581,7 @@ mod tests {
|
||||||
let b = exe_context.get_code_size(&test_addr);
|
let b = exe_context.get_code_size(&test_addr);
|
||||||
|
|
||||||
assert_eq!(a, b);
|
assert_eq!(a, b);
|
||||||
|
|
||||||
|
dummy_context_dispose(context_raw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue