From f357c63578a2a7b8d02b11700b8fc2b07fcef910 Mon Sep 17 00:00:00 2001 From: Rijnard van Tonder Date: Wed, 1 Feb 2023 15:54:46 -0600 Subject: [PATCH] move: resolve function names in ID leak verifier errors (#7909) --- crates/sui-types/src/error.rs | 4 ++++ .../tests/id_leak/direct_leak_through_call.exp | 2 +- .../tests/id_leak/indirect_leak_through_call.exp | 4 ++-- .../id_leak/through_call_with_borrow_field.exp | 2 +- .../tests/id_leak/through_direct_return.exp | 2 +- .../tests/id_leak/through_indirect_return.exp | 2 +- .../tests/id_leak/through_pack.exp | 4 ++-- .../tests/id_leak/through_vector.exp | 2 +- .../tests/id_leak/transmute.exp | 2 +- crates/sui-verifier/src/id_leak_verifier.rs | 16 +++++++++++++++- 10 files changed, 29 insertions(+), 11 deletions(-) diff --git a/crates/sui-types/src/error.rs b/crates/sui-types/src/error.rs index a982d042b18c0..0054184a43762 100644 --- a/crates/sui-types/src/error.rs +++ b/crates/sui-types/src/error.rs @@ -681,6 +681,10 @@ impl ExecutionError { &self.inner.kind } + pub fn source(&self) -> &Option { + &self.inner.source + } + pub fn to_execution_status(&self) -> ExecutionFailureStatus { self.kind().clone() } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/direct_leak_through_call.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/direct_leak_through_call.exp index a1fffffe37e24..0f8809425ad55 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/direct_leak_through_call.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/direct_leak_through_call.exp @@ -2,4 +2,4 @@ processed 1 task task 0 'publish'. lines 4-25: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function call.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function call. Found in _::m::foo") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/indirect_leak_through_call.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/indirect_leak_through_call.exp index 7663b6775b6c6..2c79cc08cb9bb 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/indirect_leak_through_call.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/indirect_leak_through_call.exp @@ -2,8 +2,8 @@ processed 2 tasks task 0 'publish'. lines 4-25: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct. Found in _::m::foo") } } task 1 'publish'. lines 27-48: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function call.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function call. Found in _::m::foo") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/through_call_with_borrow_field.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/through_call_with_borrow_field.exp index 3bc76a28a4e08..44066fec05cc2 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/through_call_with_borrow_field.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/through_call_with_borrow_field.exp @@ -2,4 +2,4 @@ processed 1 task task 0 'publish'. lines 4-34: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function call.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function call. Found in _::m::bad") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/through_direct_return.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/through_direct_return.exp index cbeda8157f57b..81bd1ce8aa589 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/through_direct_return.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/through_direct_return.exp @@ -2,4 +2,4 @@ processed 1 task task 0 'publish'. lines 4-19: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function return.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID leaked through function return. Found in _::m::foo") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/through_indirect_return.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/through_indirect_return.exp index 2bcf4b2490545..2c4d5c7200e08 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/through_indirect_return.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/through_indirect_return.exp @@ -2,4 +2,4 @@ processed 1 task task 0 'publish'. lines 4-19: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct. Found in _::m::foo") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/through_pack.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/through_pack.exp index c53fd23b3af2f..31fb77d8855ba 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/through_pack.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/through_pack.exp @@ -2,8 +2,8 @@ processed 2 tasks task 0 'publish'. lines 4-36: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct. Found in _::test::test") } } task 1 'publish'. lines 38-60: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct. Found in _::m::foo") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/through_vector.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/through_vector.exp index b6b966e1314d8..5e563a4166a78 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/through_vector.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/through_vector.exp @@ -2,4 +2,4 @@ processed 1 task task 0 'publish'. lines 4-20: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a vector.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a vector. Found in _::m::foo") } } diff --git a/crates/sui-verifier-transactional-tests/tests/id_leak/transmute.exp b/crates/sui-verifier-transactional-tests/tests/id_leak/transmute.exp index 0fc13d2405801..178709bfc8598 100644 --- a/crates/sui-verifier-transactional-tests/tests/id_leak/transmute.exp +++ b/crates/sui-verifier-transactional-tests/tests/id_leak/transmute.exp @@ -2,4 +2,4 @@ processed 1 task task 0 'publish'. lines 4-28: Error: Transaction Effects Status: Sui Move Bytecode Verification Error. Please run the Sui Move Verifier for more information. -Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct.") } } +Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: SuiMoveVerificationError, source: Some("ID is leaked into a struct. Found in _::m::transmute") } } diff --git a/crates/sui-verifier/src/id_leak_verifier.rs b/crates/sui-verifier/src/id_leak_verifier.rs index d07fb30e04fb6..1c572d5aa8a28 100644 --- a/crates/sui-verifier/src/id_leak_verifier.rs +++ b/crates/sui-verifier/src/id_leak_verifier.rs @@ -63,7 +63,21 @@ fn verify_id_leak(module: &CompiledModule) -> Result<(), ExecutionError> { FunctionView::function(module, FunctionDefinitionIndex(index as u16), code, handle); let initial_state = AbstractState::new(&func_view); let mut verifier = IDLeakAnalysis::new(&binary_view, &func_view); - verifier.analyze_function(initial_state, &func_view)?; + verifier + .analyze_function(initial_state, &func_view) + .map_err(|err| { + if let Some(message) = err.source().as_ref() { + let function_name = binary_view + .identifier_at(binary_view.function_handle_at(func_def.function).name); + let module_name = module.self_id(); + verification_failure(format!( + "{} Found in {module_name}::{function_name}", + message + )) + } else { + err + } + })?; } Ok(())