Merge remote-tracking branch 'origin/master' into experimental

This commit is contained in:
DefCon42 2020-07-05 16:23:37 -04:00
commit 8bf3480f1b
7 changed files with 38 additions and 24 deletions

View file

@ -233,9 +233,9 @@ namespace vtil::symbolic
{
// If instruction accesses memory:
//
if ( ( write && it->base->writes_memory() ) ||
( read && it->base->reads_memory() ) ||
( !read && !write && it->base->accesses_memory() ) )
if ( it->base->accesses_memory() &&
( !write || it->base->memory_write ) &&
( !read || !it->base->memory_write ) )
{
// Generate an expression for the pointer.
//
@ -288,6 +288,19 @@ namespace vtil::symbolic
{
auto& reg = var.reg();
// If $sp, indicate read from:
//
if ( reg.is_stack_pointer() )
{
if ( write ) return {};
return {
.bit_offset = 0,
.bit_count = reg.bit_count,
.read = true,
.write = false
};
}
// If exiting the virtual machine:
//
if ( it->base == &ins::vexit )
@ -298,6 +311,7 @@ namespace vtil::symbolic
{
if ( retval.overlaps( reg ) )
{
if ( write ) return {};
return {
.bit_offset = retval.bit_offset - reg.bit_offset,
.bit_count = retval.bit_count,
@ -313,10 +327,8 @@ namespace vtil::symbolic
{
if ( retval.overlaps( reg ) )
{
if ( !read )
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
else
return {};
if ( read ) return {};
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
}
}
@ -324,14 +336,13 @@ namespace vtil::symbolic
//
if ( reg.is_virtual() )
{
if ( !read )
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
else
return {};
if ( read ) return {};
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
}
// Otherwise indicate read from.
//
if ( write ) return {};
return {
.bit_offset = 0,
.bit_count = reg.bit_count,
@ -418,10 +429,8 @@ namespace vtil::symbolic
fill_displacement( &details, mem.base, pointer{ limit }, tracer, xblock );
if ( !details.is_unknown() && ( details.bit_offset + var.bit_count() ) <= 0 )
{
if ( !read )
return { .bit_offset = 0, .bit_count = var.bit_count(), .read = false, .write = true };
else
return {};
if ( read ) return {};
return { .bit_offset = 0, .bit_count = var.bit_count(), .read = false, .write = true };
}
}

View file

@ -222,7 +222,7 @@ namespace vtil
hash_t operator()( const std::optional<T>& value ) const noexcept
{
if ( value ) return make_hash( *value );
else return lt_typeid<T>::get();
else return lt_typeid_v<T>;
}
};

View file

@ -57,4 +57,7 @@ namespace vtil
//
inline static const size_t value = calculate();
};
template<typename T>
static const size_t& lt_typeid_v = lt_typeid<std::decay_t<T>>::value;
};

View file

@ -76,7 +76,7 @@ namespace vtil
const void purge() const
{
std::lock_guard _g{ mtx };
database.erase( lt_typeid<T>::value );
database.erase( lt_typeid_v<T> );
}
// Checks if we have the type in the store.
@ -85,7 +85,7 @@ namespace vtil
const bool has() const
{
std::lock_guard _g{ mtx };
return database.contains( lt_typeid<T>::value );
return database.contains( lt_typeid_v<T> );
}
// Functional getter, if variant is already in the database will return
@ -101,12 +101,12 @@ namespace vtil
// default construct it and reference that instead.
//
std::lock_guard _g{ mtx };
variant& var = database[ lt_typeid<T>::value ];
variant& var = database[ lt_typeid_v<T> ];
if( !var ) var = T{};
return var.get<T>();
}
template<typename T>
T& get() { return const_cast< T& >( ( ( const multivariate* ) this )->get<T>() ); }
T& get() { return const_cast<T&>( ( ( const multivariate* ) this )->get<T>() ); }
// Allows for convinient use of the type in the format of:
// - block_cache& cache = multivariate;

View file

@ -158,7 +158,7 @@ namespace vtil
hash_t operator()( const optional_reference<T>& value ) const noexcept
{
if ( value ) return make_hash( *value );
else return lt_typeid<T>::value;
else return lt_typeid_v<T>;
}
};
};

View file

@ -31,7 +31,6 @@
<ClCompile Include="optimizer\symbolic_rewrite_pass.cpp">
<Filter>Optimization Passes</Filter>
</ClCompile>
<ClCompile Include="optimizer\fast_dead_code_elimination_pass.cpp" />
<ClCompile Include="optimizer\fast_propagation_pass.cpp" />
<ClCompile Include="validation\test1.cpp">
<Filter>Validation</Filter>
@ -39,6 +38,9 @@
<ClCompile Include="validation\pass_validation.cpp">
<Filter>Validation</Filter>
</ClCompile>
<ClCompile Include="optimizer\fast_dead_code_elimination_pass.cpp">
<Filter>Optimization Passes</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="Includes">

View file

@ -66,8 +66,8 @@ namespace vtil::optimizer
{
// Replace with a stack shift.
//
it->base = &ins::vpinr;
it->operands = { { REG_SP } };
it->base = &ins::nop;
it->operands = {};
blk->shift_sp( *shift_offset, true, it );
// Flush tracer cache.