Yul interpreter: Smaller execution timeout for tests and additional test cases

This commit is contained in:
Bhargava Shastry 2020-07-22 22:59:15 +02:00
parent 088b694f0b
commit e1b44500dd
5 changed files with 80 additions and 3 deletions

View File

@ -87,8 +87,8 @@ bool YulInterpreterTest::parse(ostream& _stream, string const& _linePrefix, bool
string YulInterpreterTest::interpret()
{
InterpreterState state;
state.maxTraceSize = 10000;
state.maxSteps = 10000;
state.maxTraceSize = 32;
state.maxSteps = 512;
try
{
Interpreter::run(state, EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion{}), *m_ast);

View File

@ -0,0 +1,16 @@
{
function f(x) -> y {
if lt(x, 150) {
y := f(add(x, 1))
}
if eq(x, 150) {
y := x
}
}
mstore(0, f(0))
}
// ----
// Trace:
// Memory dump:
// 0: 0000000000000000000000000000000000000000000000000000000000000096
// Storage dump:

View File

@ -0,0 +1,11 @@
{
function f() {
f()
}
f()
}
// ----
// Trace:
// Interpreter execution step limit reached.
// Memory dump:
// Storage dump:

View File

@ -0,0 +1,44 @@
{
function f() {
log0(0x0, 0x0)
f()
}
f()
}
// ----
// Trace:
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// LOG0(0, 0)
// Trace size limit reached.
// Memory dump:
// Storage dump:

View File

@ -104,12 +104,18 @@ DEFINE_PROTO_FUZZER(Program const& _input)
return;
stack.optimize();
yulFuzzerUtil::interpret(
termReason = yulFuzzerUtil::interpret(
os2,
stack.parserResult()->code,
EVMDialect::strictAssemblyForEVMObjects(version)
);
if (
termReason == yulFuzzerUtil::TerminationReason::StepLimitReached ||
termReason == yulFuzzerUtil::TerminationReason::TraceLimitReached
)
return;
bool isTraceEq = (os1.str() == os2.str());
yulAssert(isTraceEq, "Interpreted traces for optimized and unoptimized code differ.");
return;