Some experiments.

This commit is contained in:
chriseth 2021-09-27 12:59:25 +02:00
parent e47023a222
commit c518b359a8
2 changed files with 34 additions and 6 deletions

View File

@ -242,14 +242,16 @@ void BooleanLPSolver::addAssertion(Expression const& _expr)
addAssertion(_expr.arguments.at(0) <= _expr.arguments.at(1) - 1);
else if (_expr.name == ">")
addAssertion(_expr.arguments.at(1) < _expr.arguments.at(0));
else
cout << "Unknown operator " << _expr.name << endl;
}
pair<CheckResult, vector<string>> BooleanLPSolver::check(vector<Expression> const& _expressionsToEvaluate)
{
cout << "Solving boolean constraint system" << endl;
cout << toString() << endl;
cout << "--------------" << endl;
// cout << "Solving boolean constraint system" << endl;
// cout << toString() << endl;
// cout << "--------------" << endl;
if (m_state.back().infeasible)
return make_pair(CheckResult::UNSATISFIABLE, vector<string>{});
@ -330,6 +332,8 @@ optional<Literal> BooleanLPSolver::parseLiteral(smtutil::Expression const& _expr
Literal::PositiveVariable,
m_state.back().variables.at(_expr.name)
};
else
cout << "cannot encode " << _expr.name << " - not a boolean literal variable." << endl;
}
else if (_expr.name == "not")
return negate(parseLiteralOrReturnEqualBoolean(_expr.arguments.at(0)));

View File

@ -165,7 +165,7 @@ void ReasoningBasedSimplifier::operator()(If& _if)
if (bodyTerminates)
{
cout << "Body always terminates." << endl;
//cout << "Body always terminates." << endl;
if (isBoolean(*_if.condition))
m_solver->addAssertion(!cond);
else
@ -267,10 +267,28 @@ void ReasoningBasedSimplifier::handleDeclaration(
}
//case evmasm::Instruction::MUL:
// TODO encode constants?
//case evmasm::Instruction::DIV:
case evmasm::Instruction::DIV:
m_solver->addAssertion(variable <= *x);
break;
case evmasm::Instruction::ADDMOD:
m_solver->addAssertion(variable < *z);
break;
case evmasm::Instruction::SHL:
if (holds_alternative<Literal>(_arguments.at(0)))
{
u256 shiftAmount = valueOfLiteral(get<Literal>(_arguments.at(0)));
cout << "shift by " << shiftAmount << endl;
}
break;
case evmasm::Instruction::SHR:
if (holds_alternative<Literal>(_arguments.at(0)))
{
u256 shiftAmount = valueOfLiteral(get<Literal>(_arguments.at(0)));
cout << "shift by " << shiftAmount << endl;
}
break;
case evmasm::Instruction::SAR:
break;
case evmasm::Instruction::LT:
m_solver->addAssertion(variable == (*x < *y));
break;
@ -281,7 +299,12 @@ void ReasoningBasedSimplifier::handleDeclaration(
// case evmasm::Instruction::SGT:
// TODO
case evmasm::Instruction::EQ:
m_solver->addAssertion(variable == (*x == *y));
if (isBoolean(_arguments.at(0)) == isBoolean(_arguments.at(1)))
m_solver->addAssertion(variable == (*x == *y));
else if (isBoolean(_arguments.at(0)))
m_solver->addAssertion(variable == ((*x && *y >= 1) || (!*x && *y == 0)));
else
m_solver->addAssertion(variable == ((*y && *x >= 1) || (!*y && *x == 0)));
break;
case evmasm::Instruction::ISZERO:
if (isBoolean(_arguments.at(0)))
@ -313,6 +336,7 @@ void ReasoningBasedSimplifier::handleDeclaration(
break;
// TODO all builtins whose return values can be restricted.
default:
cout << "Not handling instruction " << evmasm::instructionInfo(_instruction).name << endl;
break;
}
}