Permit signed and unsigned types

This commit is contained in:
Bhargava Shastry 2020-05-04 12:06:45 +02:00
parent 00def2f4fa
commit 97f94fdcc6
2 changed files with 32 additions and 28 deletions

View File

@ -81,7 +81,7 @@ string ProtoConverter::visit(VarDecl const& _vardecl)
Whiskers v(R"(<type> <varName> = <type>(<value>);)"); Whiskers v(R"(<type> <varName> = <type>(<value>);)");
string type = visit(_vardecl.t()); string type = visit(_vardecl.t());
string varName = newVarName(); string varName = newVarName();
m_varTypeMap.emplace(varName, type); m_varTypeMap.emplace(varName, pair(typeSign(_vardecl.t()), type));
v("type", type); v("type", type);
v("varName", varName); v("varName", varName);
v("value", varExists ? visit(_vardecl.value()) : to_string((*m_rand)())); v("value", varExists ? visit(_vardecl.value()) : to_string((*m_rand)()));
@ -129,21 +129,6 @@ string ProtoConverter::visit(BinaryOp const& _bop)
case BinaryOp_Op_MOD: case BinaryOp_Op_MOD:
op = " % "; op = " % ";
break; break;
// case BinaryOp_Op_ADDSELF:
// op = " += ";
// break;
// case BinaryOp_Op_SUBSELF:
// op = " -= ";
// break;
// case BinaryOp_Op_MULSELF:
// op = " *= ";
// break;
// case BinaryOp_Op_DIVSELF:
// op = " /= ";
// break;
// case BinaryOp_Op_MODSELF:
// op = " %= ";
// break;
case BinaryOp_Op_EXP: case BinaryOp_Op_EXP:
op = " ** "; op = " ** ";
break; break;
@ -153,14 +138,23 @@ string ProtoConverter::visit(BinaryOp const& _bop)
case BinaryOp_Op_SHR: case BinaryOp_Op_SHR:
op = " >> "; op = " >> ";
break; break;
// case BinaryOp_Op_SHLSELF:
// op = " <<= ";
// break;
// case BinaryOp_Op_SHRSELF:
// op = " >>= ";
// break;
} }
return visit(_bop.left()) + op + visit(_bop.right()); auto left = visit(_bop.left());
auto right = visit(_bop.right());
Sign leftSign = m_exprSignMap[&_bop.left()];
Sign rightSign = m_exprSignMap[&_bop.right()];
bool expSignChange = _bop.op() == BinaryOp_Op_EXP && rightSign == Sign::Signed;
if (expSignChange)
{
right = Whiskers(R"(uint(<expr>))")("expr", right).render();
rightSign = Sign::Unsigned;
}
if (leftSign != rightSign && _bop.op() != BinaryOp_Op_EXP)
right = signString(leftSign) + "(" + right + ")";
return left + op + right;
} }
string ProtoConverter::visit(Expression const& _expr) string ProtoConverter::visit(Expression const& _expr)
@ -173,21 +167,27 @@ string ProtoConverter::visit(Expression const& _expr)
string v = visit(_expr.v()); string v = visit(_expr.v());
if (!m_exprSignMap.count(&_expr)) if (!m_exprSignMap.count(&_expr))
m_exprSignMap.emplace(&_expr, m_varTypeMap[v].first); m_exprSignMap.emplace(&_expr, m_varTypeMap[v].first);
return v;
} }
case Expression::kBop: case Expression::kBop:
{ {
string b = visit(_expr.bop()); string b = visit(_expr.bop());
solAssert(m_exprSignMap.count(&_expr.bop().left()), "Sol arith fuzzer: Invalid binop visit");
if (!m_exprSignMap.count(&_expr)) if (!m_exprSignMap.count(&_expr))
m_exprSignMap.emplace(&_expr, m_varTypeMap[v].first); m_exprSignMap.emplace(&_expr, m_exprSignMap[&_expr.bop().left()]);
return b;
} }
case Expression::EXPR_ONEOF_NOT_SET: case Expression::EXPR_ONEOF_NOT_SET:
{
m_exprSignMap.emplace(&_expr, m_varTypeMap["v0"].first);
return "v0"; return "v0";
} }
}
} }
string ProtoConverter::visit(VarRef const&) string ProtoConverter::visit(VarRef const& _v)
{ {
return randomVarName(); return "v" + std::to_string(_v.id() % m_varCounter);
} }
string ProtoConverter::visit(Assignment const& _assignment) string ProtoConverter::visit(Assignment const& _assignment)
@ -198,7 +198,7 @@ string ProtoConverter::visit(Assignment const& _assignment)
solAssert(m_varTypeMap.count(varName), "Sol arith fuzzer: Invalid varname"); solAssert(m_varTypeMap.count(varName), "Sol arith fuzzer: Invalid varname");
Whiskers a(R"(<varName> = <type>(<expr>);)"); Whiskers a(R"(<varName> = <type>(<expr>);)");
a("varName", varName); a("varName", varName);
a("type", m_varTypeMap[varName]); a("type", m_varTypeMap[varName].second);
a("expr", visit(_assignment.value())); a("expr", visit(_assignment.value()));
return "\t\t" + a.render() + '\n'; return "\t\t" + a.render() + '\n';
} }

View File

@ -91,7 +91,11 @@ private:
} }
static std::string signString(Type::Sign _sign) static std::string signString(Type::Sign _sign)
{ {
return _sign == Type::Sign::Type_Sign_SIGNED ? "uint" : "uint"; return _sign == Type::Sign::Type_Sign_SIGNED ? "int" : "uint";
}
static std::string signString(Sign _sign)
{
return _sign == Sign::Signed ? "int" : "uint";
} }
static std::string widthString(unsigned _width) static std::string widthString(unsigned _width)
{ {