diff --git a/VTIL-Architecture/symex/translation.hpp b/VTIL-Architecture/symex/translation.hpp index e9d023d..58dae98 100644 --- a/VTIL-Architecture/symex/translation.hpp +++ b/VTIL-Architecture/symex/translation.hpp @@ -45,7 +45,7 @@ namespace vtil if ( x->symbolic_operator != math::operator_id::invalid ) tbl[ ( size_t ) x->symbolic_operator ] = x; return tbl; - }( ); + }(); fassert( lookup_table.size() > ( size_t ) op ); const instruction_desc* desc = lookup_table[ ( size_t ) op ]; @@ -89,9 +89,7 @@ namespace vtil // If constant, simply convert into operand type. // if ( exp->is_constant() ) - { return { *exp->get(), exp->size() }; - } // Assert validity and get the variable. // @@ -316,7 +314,7 @@ namespace vtil // Push [ Lhs 0 Rhs] and return Lhs. // force_clobber_register( lhs ); - block->push_back( { map_operator( op ),{ lhs, operand{ 0, rhs.bit_count() }, rhs } } ); + block->push_back( { map_operator( op ), { lhs, operand{ 0, rhs.bit_count() }, rhs } } ); return lhs; } case math::operator_id::max_value: @@ -327,7 +325,11 @@ namespace vtil // Unpack the expression by forcing re-simplification without // prettification requested and recurse. // - return cvt( exp.transform( [ ] ( auto& ) {} ), true ); + auto copy = exp; + ( +copy )->simplify_hint = false; + ( +copy )->is_lazy = false; + ( +copy )->simplify(); + return cvt( copy, true ); } case math::operator_id::greater: case math::operator_id::greater_eq: @@ -353,7 +355,7 @@ namespace vtil // Push [ Tmp Lhs Rhs] and return Tmp. // - block->push_back( { map_operator( op ),{ tmp, lhs, rhs } } ); + block->push_back( { map_operator( op ), { tmp, lhs, rhs } } ); return tmp; } default: diff --git a/VTIL-Architecture/vm/interface.hpp b/VTIL-Architecture/vm/interface.hpp index e0595df..efc0cea 100644 --- a/VTIL-Architecture/vm/interface.hpp +++ b/VTIL-Architecture/vm/interface.hpp @@ -48,11 +48,11 @@ namespace vtil { // Reads from the register. // - virtual symbolic::expression::reference read_register( const register_desc& desc ) { unreachable(); return {}; } + virtual symbolic::expression::reference read_register( const register_desc& desc ) const { unreachable(); return {}; } // Reads the given number of bytes from the memory, returns null if aliasing fails. // - virtual symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) { unreachable(); return {}; } + virtual symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) const { unreachable(); return {}; } // Writes to the register. // @@ -61,7 +61,7 @@ namespace vtil // Writes the given expression to the memory, returns false if aliasing fails. // virtual bool write_memory( const symbolic::expression::reference& pointer, deferred_value value, bitcnt_t size ) { unreachable(); return false; } - bool write_memory_v( const symbolic::expression::reference& pointer, symbolic::expression::reference value ) { return write_memory( pointer, value, value.size() ); } + bool write_memory_v( const symbolic::expression::reference& pointer, symbolic::expression::reference value ) { return write_memory( pointer, std::move( value ), value.size() ); } // Runs the given instruction, returns whether it was successful. // diff --git a/VTIL-Architecture/vm/lambda.hpp b/VTIL-Architecture/vm/lambda.hpp index 7b1e621..fdbbe76 100644 --- a/VTIL-Architecture/vm/lambda.hpp +++ b/VTIL-Architecture/vm/lambda.hpp @@ -63,13 +63,13 @@ namespace vtil // Declare the overrides redirecting to the callbacks. // - symbolic::expression::reference read_register( const register_desc& desc ) override + symbolic::expression::reference read_register( const register_desc& desc ) const override { return hooks.read_register ? hooks.read_register( desc ) : vm_base::read_register( desc ); } - symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) override + symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) const override { return hooks.read_memory ? hooks.read_memory( pointer, byte_count ) diff --git a/VTIL-Architecture/vm/symbolic.hpp b/VTIL-Architecture/vm/symbolic.hpp index b8f083d..8b99a58 100644 --- a/VTIL-Architecture/vm/symbolic.hpp +++ b/VTIL-Architecture/vm/symbolic.hpp @@ -49,7 +49,7 @@ namespace vtil // Reads from the register. // - symbolic::expression::reference read_register( const register_desc& desc ) override + symbolic::expression::reference read_register( const register_desc& desc ) const override { return register_state.read( desc, reference_iterator ); } @@ -64,7 +64,7 @@ namespace vtil // Reads the given number of bytes from the memory. // - symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) override + symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) const override { return memory_state.read( pointer, math::narrow_cast( byte_count * 8 ), reference_iterator ); } diff --git a/VTIL-SymEx/simplifier/simplifier.cpp b/VTIL-SymEx/simplifier/simplifier.cpp index 37f6f8c..50f7516 100644 --- a/VTIL-SymEx/simplifier/simplifier.cpp +++ b/VTIL-SymEx/simplifier/simplifier.cpp @@ -97,7 +97,6 @@ namespace vtil::symbolic // using queue_key = typename detached_queue::key; - // Entry itself: // expression::reference result = {};