pub struct SymbolicExecutor {
pub(crate) config: SymbolicConfig,
pub(crate) solver: Box<dyn SymbolicSolver>,
}Expand description
SMT-LIB-backed symbolic executor.
This executor is intentionally separate from the concrete revm executor used by
Foundry. It consumes bytecode and state from an existing [Executor], explores
symbolic branches, and returns either a proof result, a counterexample candidate,
or an incomplete result.
Fields§
§config: SymbolicConfig§solver: Box<dyn SymbolicSolver>Implementations§
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub(super) fn call(
&mut self,
executor: &Executor<impl FoundryEvmNetwork>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
completed_paths: &mut usize,
kind: CallKind,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn call( &mut self, executor: &Executor<impl FoundryEvmNetwork>, state: &mut PathState, worklist: &mut VecDeque<PathState>, completed_paths: &mut usize, kind: CallKind, ) -> Result<StepOutcome, SymbolicError>
Implements the call symbolic executor helper.
Sourcepub(super) fn branch_symbolic_call_value_if_needed(
&mut self,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
pre_call_state: &PathState,
call_pc: usize,
to: Address,
code_address: Address,
value: &SymWord,
gas: &SymWord,
call_input: &[SymWord],
) -> Result<bool, SymbolicError>
pub(super) fn branch_symbolic_call_value_if_needed( &mut self, state: &mut PathState, worklist: &mut VecDeque<PathState>, pre_call_state: &PathState, call_pc: usize, to: Address, code_address: Address, value: &SymWord, gas: &SymWord, call_input: &[SymWord], ) -> Result<bool, SymbolicError>
Implements the branch_symbolic_call_value_if_needed symbolic executor helper.
Sourcepub(super) fn branch_symbolic_function_mock_if_needed(
&mut self,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
pre_call_state: &PathState,
call_pc: usize,
callee: Address,
calldata: &[SymWord],
) -> Result<bool, SymbolicError>
pub(super) fn branch_symbolic_function_mock_if_needed( &mut self, state: &mut PathState, worklist: &mut VecDeque<PathState>, pre_call_state: &PathState, call_pc: usize, callee: Address, calldata: &[SymWord], ) -> Result<bool, SymbolicError>
Implements the branch_symbolic_function_mock_if_needed symbolic executor helper.
Sourcepub(super) fn observe_expected_call(
&mut self,
state: &mut PathState,
callee: Address,
value: Option<U256>,
gas: &SymWord,
calldata: &[SymWord],
) -> Result<bool, SymbolicError>
pub(super) fn observe_expected_call( &mut self, state: &mut PathState, callee: Address, value: Option<U256>, gas: &SymWord, calldata: &[SymWord], ) -> Result<bool, SymbolicError>
Applies the observe_expected_call symbolic executor helper.
Sourcepub(super) fn branch_symbolic_call_match_if_needed(
&mut self,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
pre_call_state: &PathState,
call_pc: usize,
callee: Address,
code_address: Address,
value: Option<U256>,
gas: &SymWord,
calldata: &[SymWord],
) -> Result<bool, SymbolicError>
pub(super) fn branch_symbolic_call_match_if_needed( &mut self, state: &mut PathState, worklist: &mut VecDeque<PathState>, pre_call_state: &PathState, call_pc: usize, callee: Address, code_address: Address, value: Option<U256>, gas: &SymWord, calldata: &[SymWord], ) -> Result<bool, SymbolicError>
Implements the branch_symbolic_call_match_if_needed symbolic executor helper.
Sourcepub(super) fn take_call_mock(
&mut self,
state: &mut PathState,
callee: Address,
value: Option<U256>,
calldata: &[SymWord],
) -> Result<Option<CallMockOutcome>, SymbolicError>
pub(super) fn take_call_mock( &mut self, state: &mut PathState, callee: Address, value: Option<U256>, calldata: &[SymWord], ) -> Result<Option<CallMockOutcome>, SymbolicError>
Implements the take_call_mock symbolic executor helper.
Sourcepub(super) fn branch_symbolic_match_condition_if_needed(
&mut self,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
pre_call_state: &PathState,
call_pc: usize,
condition: BoolExpr,
) -> Result<bool, SymbolicError>
pub(super) fn branch_symbolic_match_condition_if_needed( &mut self, state: &mut PathState, worklist: &mut VecDeque<PathState>, pre_call_state: &PathState, call_pc: usize, condition: BoolExpr, ) -> Result<bool, SymbolicError>
Implements the branch_symbolic_match_condition_if_needed symbolic executor helper.
Sourcepub(super) fn function_mock_target(
&mut self,
state: &mut PathState,
callee: Address,
calldata: &[SymWord],
) -> Result<Option<Address>, SymbolicError>
pub(super) fn function_mock_target( &mut self, state: &mut PathState, callee: Address, calldata: &[SymWord], ) -> Result<Option<Address>, SymbolicError>
Implements the function_mock_target symbolic executor helper.
Sourcepub(super) fn expected_call_match_constraints(
&mut self,
state: &PathState,
expected: &ExpectedCall,
callee: Address,
value: Option<U256>,
gas: &SymWord,
calldata: &[SymWord],
) -> Result<Option<Vec<BoolExpr>>, SymbolicError>
pub(super) fn expected_call_match_constraints( &mut self, state: &PathState, expected: &ExpectedCall, callee: Address, value: Option<U256>, gas: &SymWord, calldata: &[SymWord], ) -> Result<Option<Vec<BoolExpr>>, SymbolicError>
Implements the expected_call_match_constraints symbolic executor helper.
Sourcepub(super) fn call_mock_match_constraints(
&mut self,
state: &PathState,
mock: &CallMock,
callee: Address,
value: Option<U256>,
calldata: &[SymWord],
) -> Result<Option<Vec<BoolExpr>>, SymbolicError>
pub(super) fn call_mock_match_constraints( &mut self, state: &PathState, mock: &CallMock, callee: Address, value: Option<U256>, calldata: &[SymWord], ) -> Result<Option<Vec<BoolExpr>>, SymbolicError>
Implements the call_mock_match_constraints symbolic executor helper.
Sourcepub(super) fn expected_call_match_condition(
&self,
expected: &ExpectedCall,
callee: Address,
value: Option<U256>,
gas: &SymWord,
calldata: &[SymWord],
) -> Result<Option<BoolExpr>, SymbolicError>
pub(super) fn expected_call_match_condition( &self, expected: &ExpectedCall, callee: Address, value: Option<U256>, gas: &SymWord, calldata: &[SymWord], ) -> Result<Option<BoolExpr>, SymbolicError>
Implements the expected_call_match_condition symbolic executor helper.
Sourcepub(super) fn call_mock_match_condition(
&self,
mock: &CallMock,
callee: Address,
value: Option<U256>,
calldata: &[SymWord],
) -> Result<Option<BoolExpr>, SymbolicError>
pub(super) fn call_mock_match_condition( &self, mock: &CallMock, callee: Address, value: Option<U256>, calldata: &[SymWord], ) -> Result<Option<BoolExpr>, SymbolicError>
Implements the call_mock_match_condition symbolic executor helper.
Sourcepub(super) fn expected_revert_matches(
&mut self,
state: &mut PathState,
expected: &ExpectedRevert,
reverter: Address,
return_data: &SymReturnData,
) -> Result<bool, SymbolicError>
pub(super) fn expected_revert_matches( &mut self, state: &mut PathState, expected: &ExpectedRevert, reverter: Address, return_data: &SymReturnData, ) -> Result<bool, SymbolicError>
Returns whether expected_revert_matches holds.
Sourcepub(super) fn assume_no_revert_rejects(
&mut self,
state: &mut PathState,
assumption: &AssumeNoRevert,
reverter: Address,
return_data: &SymReturnData,
) -> Result<bool, SymbolicError>
pub(super) fn assume_no_revert_rejects( &mut self, state: &mut PathState, assumption: &AssumeNoRevert, reverter: Address, return_data: &SymReturnData, ) -> Result<bool, SymbolicError>
Implements the assume_no_revert_rejects symbolic executor helper.
Sourcepub(super) fn constraints_for_condition(
&mut self,
state: &PathState,
condition: BoolExpr,
) -> Result<Option<Vec<BoolExpr>>, SymbolicError>
pub(super) fn constraints_for_condition( &mut self, state: &PathState, condition: BoolExpr, ) -> Result<Option<Vec<BoolExpr>>, SymbolicError>
Implements the constraints_for_condition symbolic executor helper.
Sourcepub(super) fn constraints_with_condition(
&mut self,
state: &PathState,
condition: BoolExpr,
) -> Result<(Vec<BoolExpr>, bool), SymbolicError>
pub(super) fn constraints_with_condition( &mut self, state: &PathState, condition: BoolExpr, ) -> Result<(Vec<BoolExpr>, bool), SymbolicError>
Implements the constraints_with_condition symbolic executor helper.
Sourcepub(super) fn take_loop_jump(
&self,
state: &mut PathState,
source_pc: usize,
dest: usize,
) -> bool
pub(super) fn take_loop_jump( &self, state: &mut PathState, source_pc: usize, dest: usize, ) -> bool
Implements the take_loop_jump symbolic executor helper.
Sourcepub(super) fn handle_log(
&mut self,
state: &mut PathState,
log: SymbolicLog,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn handle_log( &mut self, state: &mut PathState, log: SymbolicLog, ) -> Result<StepOutcome, SymbolicError>
Runs the handle_log symbolic executor helper.
Sourcepub(super) fn expected_emit_matches(
&mut self,
state: &mut PathState,
expected: &ExpectedEmit,
template: &SymbolicLog,
actual: &SymbolicLog,
) -> Result<bool, SymbolicError>
pub(super) fn expected_emit_matches( &mut self, state: &mut PathState, expected: &ExpectedEmit, template: &SymbolicLog, actual: &SymbolicLog, ) -> Result<bool, SymbolicError>
Returns whether expected_emit_matches holds.
Sourcepub(super) fn call_concrete_target<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
completed_paths: &mut usize,
kind: CallKind,
to: Address,
target_word: Option<SymWord>,
value: SymWord,
gas: SymWord,
in_offset: SymWord,
in_size: BoundedCopySize,
out_offset: SymWord,
out_size: BoundedCopySize,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn call_concrete_target<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: &mut PathState, worklist: &mut VecDeque<PathState>, completed_paths: &mut usize, kind: CallKind, to: Address, target_word: Option<SymWord>, value: SymWord, gas: SymWord, in_offset: SymWord, in_size: BoundedCopySize, out_offset: SymWord, out_size: BoundedCopySize, ) -> Result<StepOutcome, SymbolicError>
Implements the call_concrete_target symbolic executor helper.
Sourcepub(super) fn prepare_value_transfer<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
value: SymWord,
out_offset: SymWord,
out_size: &BoundedCopySize,
) -> Result<bool, SymbolicError>
pub(super) fn prepare_value_transfer<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: &mut PathState, worklist: &mut VecDeque<PathState>, value: SymWord, out_offset: SymWord, out_size: &BoundedCopySize, ) -> Result<bool, SymbolicError>
Implements the prepare_value_transfer symbolic executor helper.
Sourcepub(super) fn prepare_create_value_transfer<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
value: SymWord,
) -> Result<bool, SymbolicError>
pub(super) fn prepare_create_value_transfer<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: &mut PathState, worklist: &mut VecDeque<PathState>, value: SymWord, ) -> Result<bool, SymbolicError>
Implements the prepare_create_value_transfer symbolic executor helper.
Sourcepub(super) fn call_symbolic_target<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
completed_paths: &mut usize,
kind: CallKind,
target: SymWord,
value: SymWord,
gas: SymWord,
in_offset: SymWord,
in_size: BoundedCopySize,
out_offset: SymWord,
out_size: BoundedCopySize,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn call_symbolic_target<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: &mut PathState, worklist: &mut VecDeque<PathState>, completed_paths: &mut usize, kind: CallKind, target: SymWord, value: SymWord, gas: SymWord, in_offset: SymWord, in_size: BoundedCopySize, out_offset: SymWord, out_size: BoundedCopySize, ) -> Result<StepOutcome, SymbolicError>
Implements the call_symbolic_target symbolic executor helper.
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub(super) fn handle_assertion(
&mut self,
state: &mut PathState,
pass: BoolExpr,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn handle_assertion( &mut self, state: &mut PathState, pass: BoolExpr, ) -> Result<CheatcodeOutcome, SymbolicError>
Runs the handle_assertion symbolic executor helper.
Sourcepub(super) fn set_expected_revert(
&mut self,
state: &mut PathState,
data: ExpectedRevertData,
reverter: Option<SymWord>,
remaining: u64,
) -> CheatcodeOutcome
pub(super) fn set_expected_revert( &mut self, state: &mut PathState, data: ExpectedRevertData, reverter: Option<SymWord>, remaining: u64, ) -> CheatcodeOutcome
Applies the set_expected_revert symbolic executor helper.
Sourcepub(super) fn set_expected_emit(
&mut self,
state: &mut PathState,
checks: ExpectedEmitChecks,
emitter: Option<SymWord>,
remaining: u64,
) -> CheatcodeOutcome
pub(super) fn set_expected_emit( &mut self, state: &mut PathState, checks: ExpectedEmitChecks, emitter: Option<SymWord>, remaining: u64, ) -> CheatcodeOutcome
Applies the set_expected_emit symbolic executor helper.
Sourcepub(super) fn set_expected_call(
&mut self,
state: &mut PathState,
callee: SymWord,
value: Option<U256>,
gas: Option<u64>,
min_gas: Option<u64>,
data: Vec<SymWord>,
count: Option<u64>,
) -> CheatcodeOutcome
pub(super) fn set_expected_call( &mut self, state: &mut PathState, callee: SymWord, value: Option<U256>, gas: Option<u64>, min_gas: Option<u64>, data: Vec<SymWord>, count: Option<u64>, ) -> CheatcodeOutcome
Applies the set_expected_call symbolic executor helper.
Sourcepub(super) fn set_expected_create(
&mut self,
state: &mut PathState,
bytecode: Vec<u8>,
deployer: SymWord,
kind: CreateKind,
) -> CheatcodeOutcome
pub(super) fn set_expected_create( &mut self, state: &mut PathState, bytecode: Vec<u8>, deployer: SymWord, kind: CreateKind, ) -> CheatcodeOutcome
Applies the set_expected_create symbolic executor helper.
Sourcepub(super) fn observe_expected_create(
&mut self,
state: &mut PathState,
deployer: Address,
kind: CreateKind,
runtime: &SymReturnData,
) -> Result<(), SymbolicError>
pub(super) fn observe_expected_create( &mut self, state: &mut PathState, deployer: Address, kind: CreateKind, runtime: &SymReturnData, ) -> Result<(), SymbolicError>
Applies the observe_expected_create symbolic executor helper.
Sourcepub(super) fn branch_accesses_cheatcode_if_needed(
&mut self,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
selector: [u8; 4],
in_offset: usize,
out_offset: SymWord,
out_size: &BoundedCopySize,
) -> Result<Option<StepOutcome>, SymbolicError>
pub(super) fn branch_accesses_cheatcode_if_needed( &mut self, state: &mut PathState, worklist: &mut VecDeque<PathState>, selector: [u8; 4], in_offset: usize, out_offset: SymWord, out_size: &BoundedCopySize, ) -> Result<Option<StepOutcome>, SymbolicError>
Implements the branch_accesses_cheatcode_if_needed symbolic executor helper.
Sourcepub(super) fn accesses_return_data_for_target(
&mut self,
state: &mut PathState,
target: SymWord,
) -> Result<SymReturnData, SymbolicError>
pub(super) fn accesses_return_data_for_target( &mut self, state: &mut PathState, target: SymWord, ) -> Result<SymReturnData, SymbolicError>
Implements the accesses_return_data_for_target symbolic executor helper.
Sourcepub(super) fn add_call_mock(
&mut self,
state: &mut PathState,
callee: SymWord,
value: Option<U256>,
data: Vec<SymWord>,
returns: Vec<SymReturnData>,
reverts: bool,
) -> CheatcodeOutcome
pub(super) fn add_call_mock( &mut self, state: &mut PathState, callee: SymWord, value: Option<U256>, data: Vec<SymWord>, returns: Vec<SymReturnData>, reverts: bool, ) -> CheatcodeOutcome
Implements the add_call_mock symbolic executor helper.
Sourcepub(super) fn set_function_mock(
&mut self,
state: &mut PathState,
callee: SymWord,
target: Address,
data: Vec<SymWord>,
) -> CheatcodeOutcome
pub(super) fn set_function_mock( &mut self, state: &mut PathState, callee: SymWord, target: Address, data: Vec<SymWord>, ) -> CheatcodeOutcome
Applies the set_function_mock symbolic executor helper.
Sourcepub(super) fn handle_foundry_cheatcode<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: &mut PathState,
selector: [u8; 4],
in_offset: usize,
in_size: usize,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn handle_foundry_cheatcode<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: &mut PathState, selector: [u8; 4], in_offset: usize, in_size: usize, ) -> Result<CheatcodeOutcome, SymbolicError>
Runs the handle_foundry_cheatcode symbolic executor helper.
Sourcepub(super) fn handle_symbolic_vm_cheatcode(
&mut self,
state: &mut PathState,
selector: [u8; 4],
in_offset: usize,
) -> Result<SymReturnData, SymbolicError>
pub(super) fn handle_symbolic_vm_cheatcode( &mut self, state: &mut PathState, selector: [u8; 4], in_offset: usize, ) -> Result<SymReturnData, SymbolicError>
Runs the handle_symbolic_vm_cheatcode symbolic executor helper.
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub(super) fn handle_assume(
&mut self,
state: &mut PathState,
condition_offset: usize,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn handle_assume( &mut self, state: &mut PathState, condition_offset: usize, ) -> Result<CheatcodeOutcome, SymbolicError>
Runs the handle_assume symbolic executor helper.
Sourcepub(super) fn handle_skip(
&mut self,
state: &mut PathState,
condition_offset: usize,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn handle_skip( &mut self, state: &mut PathState, condition_offset: usize, ) -> Result<CheatcodeOutcome, SymbolicError>
Runs the handle_skip symbolic executor helper.
Sourcepub(super) fn assume_condition(
&mut self,
state: &mut PathState,
condition: BoolExpr,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn assume_condition( &mut self, state: &mut PathState, condition: BoolExpr, ) -> Result<CheatcodeOutcome, SymbolicError>
Implements the assume_condition symbolic executor helper.
Sourcepub(super) fn solver_upper_bound_usize(
&mut self,
state: &PathState,
word: &SymWord,
max: usize,
reason: &'static str,
) -> Result<usize, SymbolicError>
pub(super) fn solver_upper_bound_usize( &mut self, state: &PathState, word: &SymWord, max: usize, reason: &'static str, ) -> Result<usize, SymbolicError>
Implements the solver_upper_bound_usize symbolic executor helper.
Sourcepub(super) fn assume_word_at_least(
&mut self,
state: &mut PathState,
word: &SymWord,
min: usize,
) -> Result<bool, SymbolicError>
pub(super) fn assume_word_at_least( &mut self, state: &mut PathState, word: &SymWord, min: usize, ) -> Result<bool, SymbolicError>
Implements the assume_word_at_least symbolic executor helper.
Sourcepub(super) fn validate_symbolic_integer_bits(
bits: U256,
context: &'static str,
) -> Result<(), SymbolicError>
pub(super) fn validate_symbolic_integer_bits( bits: U256, context: &'static str, ) -> Result<(), SymbolicError>
Rejects symbolic integer bit widths outside the EVM word size.
Sourcepub(super) fn handle_bound_uint(
&mut self,
state: &mut PathState,
args_offset: usize,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn handle_bound_uint( &mut self, state: &mut PathState, args_offset: usize, ) -> Result<CheatcodeOutcome, SymbolicError>
Runs the handle_bound_uint symbolic executor helper.
Sourcepub(super) fn handle_bound_int(
&mut self,
state: &mut PathState,
args_offset: usize,
) -> Result<CheatcodeOutcome, SymbolicError>
pub(super) fn handle_bound_int( &mut self, state: &mut PathState, args_offset: usize, ) -> Result<CheatcodeOutcome, SymbolicError>
Runs the handle_bound_int symbolic executor helper.
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub(super) fn create<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
completed_paths: &mut usize,
kind: CreateKind,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn create<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: &mut PathState, worklist: &mut VecDeque<PathState>, completed_paths: &mut usize, kind: CreateKind, ) -> Result<StepOutcome, SymbolicError>
Implements the create symbolic executor helper.
Sourcepub(super) fn execute_external_call<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
initial: PathState,
code: &SymCode,
completed_paths: &mut usize,
) -> Result<Vec<ExternalCallOutcome>, SymbolicError>
pub(super) fn execute_external_call<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, initial: PathState, code: &SymCode, completed_paths: &mut usize, ) -> Result<Vec<ExternalCallOutcome>, SymbolicError>
Computes the execute_external_call symbolic executor helper result.
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub(super) fn execute_invariant_check<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: PathState,
invariant_address: Address,
sender: Address,
invariant: &Function,
after_invariant: Option<&Function>,
completed_paths: &mut usize,
) -> Result<Vec<InvariantCheckOutcome>, SymbolicError>
pub(super) fn execute_invariant_check<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: PathState, invariant_address: Address, sender: Address, invariant: &Function, after_invariant: Option<&Function>, completed_paths: &mut usize, ) -> Result<Vec<InvariantCheckOutcome>, SymbolicError>
Computes the execute_invariant_check symbolic executor helper result.
Sourcepub(super) fn invariant_return_failed(
&mut self,
invariant: &Function,
return_data: &SymReturnData,
state: &mut PathState,
) -> Result<bool, SymbolicError>
pub(super) fn invariant_return_failed( &mut self, invariant: &Function, return_data: &SymReturnData, state: &mut PathState, ) -> Result<bool, SymbolicError>
Implements the invariant_return_failed symbolic executor helper.
Sourcepub(super) fn execute_sequence_call<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
state: PathState,
target: Address,
sender: Address,
_function: &Function,
calldata: SymCalldata,
constraints: Vec<BoolExpr>,
completed_paths: &mut usize,
) -> Result<Vec<TopLevelCallOutcome>, SymbolicError>
pub(super) fn execute_sequence_call<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, state: PathState, target: Address, sender: Address, _function: &Function, calldata: SymCalldata, constraints: Vec<BoolExpr>, completed_paths: &mut usize, ) -> Result<Vec<TopLevelCallOutcome>, SymbolicError>
Computes the execute_sequence_call symbolic executor helper result.
Sourcepub(super) fn materialize_sequence(
&mut self,
steps: &[SequenceStepTemplate],
state: &PathState,
) -> Result<Vec<SymbolicInvariantStep>, SymbolicError>
pub(super) fn materialize_sequence( &mut self, steps: &[SequenceStepTemplate], state: &PathState, ) -> Result<Vec<SymbolicInvariantStep>, SymbolicError>
Runs the materialize_sequence symbolic executor helper.
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub(super) fn step<FEN: FoundryEvmNetwork>(
&mut self,
executor: &Executor<FEN>,
code: &SymCode,
jumpdests: &BTreeSet<usize>,
state: &mut PathState,
worklist: &mut VecDeque<PathState>,
completed_paths: &mut usize,
op: u8,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn step<FEN: FoundryEvmNetwork>( &mut self, executor: &Executor<FEN>, code: &SymCode, jumpdests: &BTreeSet<usize>, state: &mut PathState, worklist: &mut VecDeque<PathState>, completed_paths: &mut usize, op: u8, ) -> Result<StepOutcome, SymbolicError>
Runs the step symbolic executor helper.
Sourcepub(super) fn assume_returndata_copy_in_bounds(
&mut self,
state: &mut PathState,
offset: SymWord,
size: SymWord,
) -> Result<bool, SymbolicError>
pub(super) fn assume_returndata_copy_in_bounds( &mut self, state: &mut PathState, offset: SymWord, size: SymWord, ) -> Result<bool, SymbolicError>
Implements the assume_returndata_copy_in_bounds symbolic executor helper.
Sourcepub(super) fn return_or_revert(
&mut self,
state: &mut PathState,
is_revert: bool,
) -> Result<StepOutcome, SymbolicError>
pub(super) fn return_or_revert( &mut self, state: &mut PathState, is_revert: bool, ) -> Result<StepOutcome, SymbolicError>
Implements the return_or_revert symbolic executor helper.
Sourcepub(super) fn classify_revert(
&self,
state: &PathState,
offset: SymWord,
size: usize,
) -> StepOutcome
pub(super) fn classify_revert( &self, state: &PathState, offset: SymWord, size: usize, ) -> StepOutcome
Runs the classify_revert symbolic executor helper.
Source§impl SymbolicExecutor
impl SymbolicExecutor
Sourcepub fn new(config: SymbolicConfig) -> Self
pub fn new(config: SymbolicConfig) -> Self
Creates a symbolic executor from Foundry’s symbolic configuration.
The configured solver command is not executed here. Solver availability is
checked by Self::run so construction remains cheap and side-effect free.
The executor owns an isolated solver backend and symbolic world overlay. Create a fresh executor when a caller needs independent solver query accounting.
Sourcepub fn portfolio_diagnostics(&self) -> Option<PortfolioDiagnostics>
pub fn portfolio_diagnostics(&self) -> Option<PortfolioDiagnostics>
Returns staged solver portfolio diagnostics collected by this executor.
Sourcepub fn capture_diagnostics(&mut self)
pub fn capture_diagnostics(&mut self)
Defers verbose solver diagnostics until the caller explicitly takes them.
Sourcepub fn take_diagnostics(&mut self) -> Option<String>
pub fn take_diagnostics(&mut self) -> Option<String>
Returns and clears deferred verbose solver diagnostics.
Sourcepub fn set_query_observer(
&mut self,
observer: impl Fn(usize) + Send + Sync + 'static,
)
pub fn set_query_observer( &mut self, observer: impl Fn(usize) + Send + Sync + 'static, )
Registers a callback invoked after each solver query for live progress rendering.
Sourcepub fn run<FEN: FoundryEvmNetwork>(
&mut self,
input: SymbolicRunInput<'_, FEN>,
) -> SymbolicRunResult
pub fn run<FEN: FoundryEvmNetwork>( &mut self, input: SymbolicRunInput<'_, FEN>, ) -> SymbolicRunResult
Executes one function symbolically against an already-deployed test contract.
The input executor supplies the deployed bytecode, storage backend, caller, and
target address established by the normal forge test setup flow. This method
does not mutate the concrete executor and does not replay failures itself; when
it returns SymbolicRunResult::Counterexample, callers should replay the
returned arguments through the concrete executor before reporting the failure.
Unsupported opcodes, unsupported ABI types, missing solver support, and resource
limit exhaustion are reported as SymbolicRunResult::Incomplete.
Ordinary Solidity require reverts prune the current path. Assertion failures,
forge-std assertion reverts, and DSTest failure signals are reported as
counterexample candidates when the failing path is satisfiable.
Sourcepub fn run_invariant<FEN: FoundryEvmNetwork>(
&mut self,
input: SymbolicInvariantRunInput<'_, FEN>,
) -> SymbolicInvariantRunResult
pub fn run_invariant<FEN: FoundryEvmNetwork>( &mut self, input: SymbolicInvariantRunInput<'_, FEN>, ) -> SymbolicInvariantRunResult
Executes a bounded symbolic invariant call sequence.
Each sequence step chooses from the concrete target functions and senders supplied by Foundry’s invariant target discovery. Arguments are generated through the same symbolic ABI model used by stateless symbolic tests, and the symbolic world state is preserved between steps. Returned counterexamples must still be replayed by the caller before reporting.
The configured invariant depth limits the number of target calls explored before the invariant is checked. A depth of zero checks only the invariant against setup state.
Sourcepub(super) fn run_inner<FEN: FoundryEvmNetwork>(
&mut self,
input: SymbolicRunInput<'_, FEN>,
) -> Result<SymbolicRunResult, SymbolicError>
pub(super) fn run_inner<FEN: FoundryEvmNetwork>( &mut self, input: SymbolicRunInput<'_, FEN>, ) -> Result<SymbolicRunResult, SymbolicError>
Runs the run_inner symbolic executor helper.
Sourcepub(super) fn materialize_stateless_counterexample(
&mut self,
calldata: &SymbolicCalldata,
function: &Function,
state: &PathState,
) -> Result<(Vec<DynSolValue>, Bytes), SymbolicError>
pub(super) fn materialize_stateless_counterexample( &mut self, calldata: &SymbolicCalldata, function: &Function, state: &PathState, ) -> Result<(Vec<DynSolValue>, Bytes), SymbolicError>
Runs the materialize_stateless_counterexample symbolic executor helper.
Sourcepub(super) fn run_invariant_inner<FEN: FoundryEvmNetwork>(
&mut self,
input: SymbolicInvariantRunInput<'_, FEN>,
) -> Result<SymbolicInvariantRunResult, SymbolicError>
pub(super) fn run_invariant_inner<FEN: FoundryEvmNetwork>( &mut self, input: SymbolicInvariantRunInput<'_, FEN>, ) -> Result<SymbolicInvariantRunResult, SymbolicError>
Runs the run_invariant_inner symbolic executor helper.
Sourcepub(super) fn stats_with_paths(&self, paths: usize) -> SymbolicStats
pub(super) fn stats_with_paths(&self, paths: usize) -> SymbolicStats
Implements the stats_with_paths symbolic executor helper.
Sourcefn heuristic_witnesses_used_since(&self, baseline: usize) -> bool
fn heuristic_witnesses_used_since(&self, baseline: usize) -> bool
Returns whether this run used a hard-arithmetic heuristic witness.
Sourcefn hard_arith_heuristic_incomplete_reason() -> String
fn hard_arith_heuristic_incomplete_reason() -> String
Returns the incomplete reason used when heuristic witnesses cannot certify safety.
Auto Trait Implementations§
impl !RefUnwindSafe for SymbolicExecutor
impl !Send for SymbolicExecutor
impl !Sync for SymbolicExecutor
impl !UnwindSafe for SymbolicExecutor
impl Freeze for SymbolicExecutor
impl Unpin for SymbolicExecutor
impl UnsafeUnpin for SymbolicExecutor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<T> Conv for T
impl<T> Conv for T
impl<T> ErasedDestructor for Twhere
T: 'static,
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv] from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv] from a transaction, its sender, and encoded transaction bytes.§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 256 bytes