Stricter instruction verification and fixed read from imm.

This commit is contained in:
Can Bölük 2020-06-13 01:07:15 +02:00
parent 7a74827291
commit 1773dcd7b0
7 changed files with 32 additions and 15 deletions

View file

@ -140,6 +140,8 @@ namespace vtil
//
basic_block::iterator basic_block::insert( const const_iterator& it_const, instruction&& ins )
{
fassert( ins.is_valid() );
// Drop const qualifier of the iterator, since we are in a non-const
// qualified member function, this qualifier is unnecessary.
//

View file

@ -114,8 +114,16 @@ namespace vtil
}
else
{
operand base = cvt( var.mem().decay() );
if ( base.is_immediate() )
{
operand tmp2 = block->tmp( 64 );
block->mov( tmp2, base );
base = tmp2;
}
operand tmp = block->tmp( exp.size() );
block->ldd( tmp, cvt( var.mem().decay() ), 0 );
block->ldd( tmp, base, 0 );
return tmp;
}
}

View file

@ -41,14 +41,10 @@ namespace vtil::assert
line_number,
condition_str
);
logger::impl::noreturn_helper();
}
};
#ifdef _DEBUG
#define fassert__stringify(x) #x
#define fassert(x) vtil::assert::or_die( bool(x), __FILE__, __LINE__, fassert__stringify(x) )
#define unreachable() vtil::logger::error( "Illegal control flow. %s:%d", __FILE__, __LINE__ )
#else
#define fassert(...)
#define unreachable() vtil::logger::impl::noreturn_helper()
#endif
#define fassert__stringify(x) #x
#define fassert(x) vtil::assert::or_die( bool(x), __FILE__, __LINE__, fassert__stringify(x) )
#define unreachable() vtil::logger::error( "Illegal control flow. %s:%d", __FILE__, __LINE__ )

View file

@ -255,10 +255,7 @@ namespace vtil::logger
log<CON_RED>( "\n%s\n", message.data() );
// Break the program.
//
#ifndef _DEBUG
exit( EXIT_FAILURE );
#endif
//
impl::noreturn_helper();
}
};

View file

@ -125,6 +125,11 @@ namespace vtil::optimizer
//
if ( res.is_constant() )
{
// If operand does not accept immediates, skip.
//
if ( type != operand_type::read_any )
continue;
// Replace the operand with a constant.
//
operand_swap_buffer.emplace_back( &op, operand{ *res.get(), ( bitcnt_t ) op.size() * 8 } );

View file

@ -175,6 +175,7 @@ namespace vtil::optimizer
reg.flags = dst.reg().flags;
reg.bit_offset += dst.reg().bit_offset - src.reg().bit_offset;
}
fassert( ins.is_valid() );
} );
// Nop the origin instruction.

View file

@ -118,7 +118,7 @@ namespace vtil::optimizer
// Buffer a mov instruction.
//
instruction_buffer.push_back( { &ins::mov,{ k, op } } );
instruction_buffer.push_back( { &ins::mov, { k, op } } );
}
// For each memory state:
@ -145,12 +145,20 @@ namespace vtil::optimizer
}
else
{
operand base = translator << k.base;
if ( base.is_immediate() )
{
operand tmp = temporary_block.tmp( bitcnt_t( base.size() * 8 ) );
instruction_buffer.push_back( { &ins::mov, { tmp, base } } );
base = tmp;
}
// Buffer a str <ptr>, 0, value.
//
instruction_buffer.push_back(
{
&ins::str,
{ translator << k.base, make_imm<int64_t>( 0 ), translator << v.simplify( true ) }
{ base, make_imm<int64_t>( 0 ), translator << v.simplify( true ) }
} );
}
}