mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Proto fuzzer: Add missing memory and log opcodes and fix visitation bug
for ternary ops
This commit is contained in:
parent
0dc461b926
commit
d894ffad16
@ -126,6 +126,12 @@ void ProtoConverter::visit(Expression const& _x)
|
||||
case Expression::kUnop:
|
||||
visit(_x.unop());
|
||||
break;
|
||||
case Expression::kTop:
|
||||
visit(_x.top());
|
||||
break;
|
||||
case Expression::kNop:
|
||||
visit(_x.nop());
|
||||
break;
|
||||
case Expression::EXPR_ONEOF_NOT_SET:
|
||||
m_output << "1";
|
||||
break;
|
||||
@ -327,6 +333,89 @@ void ProtoConverter::visit(TernaryOp const& _x)
|
||||
m_output << ")";
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(NullaryOp const& _x)
|
||||
{
|
||||
switch (_x.op())
|
||||
{
|
||||
case NullaryOp::PC:
|
||||
m_output << "pc()";
|
||||
break;
|
||||
case NullaryOp::MSIZE:
|
||||
m_output << "msize()";
|
||||
break;
|
||||
case NullaryOp::GAS:
|
||||
m_output << "gas()";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(LogFunc const& _x)
|
||||
{
|
||||
switch (_x.num_topics())
|
||||
{
|
||||
case LogFunc::ZERO:
|
||||
m_output << "log0";
|
||||
m_output << "(";
|
||||
visit(_x.pos());
|
||||
m_output << ", ";
|
||||
visit(_x.size());
|
||||
m_output << ")\n";
|
||||
break;
|
||||
case LogFunc::ONE:
|
||||
m_output << "log1";
|
||||
m_output << "(";
|
||||
visit(_x.pos());
|
||||
m_output << ", ";
|
||||
visit(_x.size());
|
||||
m_output << ", ";
|
||||
visit(_x.t1());
|
||||
m_output << ")\n";
|
||||
break;
|
||||
case LogFunc::TWO:
|
||||
m_output << "log2";
|
||||
m_output << "(";
|
||||
visit(_x.pos());
|
||||
m_output << ", ";
|
||||
visit(_x.size());
|
||||
m_output << ", ";
|
||||
visit(_x.t1());
|
||||
m_output << ", ";
|
||||
visit(_x.t2());
|
||||
m_output << ")\n";
|
||||
break;
|
||||
case LogFunc::THREE:
|
||||
m_output << "log3";
|
||||
m_output << "(";
|
||||
visit(_x.pos());
|
||||
m_output << ", ";
|
||||
visit(_x.size());
|
||||
m_output << ", ";
|
||||
visit(_x.t1());
|
||||
m_output << ", ";
|
||||
visit(_x.t2());
|
||||
m_output << ", ";
|
||||
visit(_x.t3());
|
||||
m_output << ")\n";
|
||||
break;
|
||||
case LogFunc::FOUR:
|
||||
m_output << "log4";
|
||||
m_output << "(";
|
||||
visit(_x.pos());
|
||||
m_output << ", ";
|
||||
visit(_x.size());
|
||||
m_output << ", ";
|
||||
visit(_x.t1());
|
||||
m_output << ", ";
|
||||
visit(_x.t2());
|
||||
m_output << ", ";
|
||||
visit(_x.t3());
|
||||
m_output << ", ";
|
||||
visit(_x.t4());
|
||||
m_output << ")\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(AssignmentStatement const& _x)
|
||||
{
|
||||
visit(_x.ref_id());
|
||||
@ -353,6 +442,9 @@ void ProtoConverter::visit(StoreFunc const& _x)
|
||||
case StoreFunc::SSTORE:
|
||||
m_output << "sstore(";
|
||||
break;
|
||||
case StoreFunc::MSTORE8:
|
||||
m_output << "mstore8(";
|
||||
break;
|
||||
}
|
||||
visit(_x.loc());
|
||||
m_output << ", ";
|
||||
@ -440,6 +532,9 @@ void ProtoConverter::visit(Statement const& _x)
|
||||
if (m_inForScope.top())
|
||||
m_output << "continue\n";
|
||||
break;
|
||||
case Statement::kLogFunc:
|
||||
visit(_x.log_func());
|
||||
break;
|
||||
case Statement::STMT_ONEOF_NOT_SET:
|
||||
break;
|
||||
}
|
||||
|
@ -67,6 +67,8 @@ private:
|
||||
void visit(CaseStmt const&);
|
||||
void visit(SwitchStmt const&);
|
||||
void visit(TernaryOp const&);
|
||||
void visit(NullaryOp const&);
|
||||
void visit(LogFunc const&);
|
||||
template <class T>
|
||||
void visit(google::protobuf::RepeatedPtrField<T> const& _repeated_field);
|
||||
|
||||
|
@ -122,22 +122,51 @@ message TernaryOp {
|
||||
required Expression arg3 = 4;
|
||||
}
|
||||
|
||||
message NullaryOp {
|
||||
enum NOp {
|
||||
PC = 1;
|
||||
MSIZE = 2;
|
||||
GAS = 3;
|
||||
}
|
||||
required NOp op = 1;
|
||||
}
|
||||
|
||||
message StoreFunc {
|
||||
enum Storage {
|
||||
MSTORE = 0;
|
||||
SSTORE = 1;
|
||||
MSTORE8 = 2;
|
||||
}
|
||||
required Expression loc = 1;
|
||||
required Expression val = 2;
|
||||
required Storage st = 3;
|
||||
}
|
||||
|
||||
message LogFunc {
|
||||
enum NumTopics {
|
||||
ZERO = 0;
|
||||
ONE = 1;
|
||||
TWO = 2;
|
||||
THREE = 3;
|
||||
FOUR = 4;
|
||||
}
|
||||
required Expression pos = 1;
|
||||
required Expression size = 2;
|
||||
required NumTopics num_topics = 3;
|
||||
required Expression t1 = 4;
|
||||
required Expression t2 = 5;
|
||||
required Expression t3 = 6;
|
||||
required Expression t4 = 7;
|
||||
}
|
||||
|
||||
message Expression {
|
||||
oneof expr_oneof {
|
||||
VarRef varref = 1;
|
||||
Literal cons = 2;
|
||||
BinaryOp binop = 3;
|
||||
UnaryOp unop = 4;
|
||||
TernaryOp top = 5;
|
||||
NullaryOp nop = 6;
|
||||
}
|
||||
}
|
||||
|
||||
@ -180,6 +209,7 @@ message Statement {
|
||||
SwitchStmt switchstmt = 7;
|
||||
BreakStmt breakstmt = 8;
|
||||
ContinueStmt contstmt = 9;
|
||||
LogFunc log_func = 10;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user