From 0b1d0e0bd2ca466aa4d940d559953b7266fe1d7a Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Wed, 22 Jul 2020 22:59:15 +0200 Subject: [PATCH] Yul interpreter: Smaller execution timeout for tests and additional test cases --- test/libyul/YulInterpreterTest.cpp | 4 ++-- .../infinite_recursion.yul | 11 ++++++++++ .../infinite_recursion_tracelimit.yul | 22 +++++++++++++++++++ test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp | 13 +++++------ 4 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 test/libyul/yulInterpreterTests/infinite_recursion.yul create mode 100644 test/libyul/yulInterpreterTests/infinite_recursion_tracelimit.yul diff --git a/test/libyul/YulInterpreterTest.cpp b/test/libyul/YulInterpreterTest.cpp index 78e815785..4452eb0ca 100644 --- a/test/libyul/YulInterpreterTest.cpp +++ b/test/libyul/YulInterpreterTest.cpp @@ -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 = 10; + state.maxSteps = 150; try { Interpreter::run(state, EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion{}), *m_ast); diff --git a/test/libyul/yulInterpreterTests/infinite_recursion.yul b/test/libyul/yulInterpreterTests/infinite_recursion.yul new file mode 100644 index 000000000..0e3109ab5 --- /dev/null +++ b/test/libyul/yulInterpreterTests/infinite_recursion.yul @@ -0,0 +1,11 @@ +{ + function f() { + f() + } + f() +} +// ---- +// Trace: +// Interpreter execution step limit reached. +// Memory dump: +// Storage dump: diff --git a/test/libyul/yulInterpreterTests/infinite_recursion_tracelimit.yul b/test/libyul/yulInterpreterTests/infinite_recursion_tracelimit.yul new file mode 100644 index 000000000..cfe63639f --- /dev/null +++ b/test/libyul/yulInterpreterTests/infinite_recursion_tracelimit.yul @@ -0,0 +1,22 @@ +{ + 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) +// Trace size limit reached. +// Memory dump: +// Storage dump: diff --git a/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp b/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp index c95b4db7f..edbcf133a 100644 --- a/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp +++ b/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp @@ -91,25 +91,22 @@ DEFINE_PROTO_FUZZER(Program const& _input) ostringstream os1; ostringstream os2; - yulFuzzerUtil::TerminationReason termReason = yulFuzzerUtil::interpret( + yulFuzzerUtil::interpret( os1, stack.parserResult()->code, EVMDialect::strictAssemblyForEVMObjects(version) ); - if ( - termReason == yulFuzzerUtil::TerminationReason::StepLimitReached || - termReason == yulFuzzerUtil::TerminationReason::TraceLimitReached - ) - return; - stack.optimize(); - yulFuzzerUtil::interpret( + yulFuzzerUtil::TerminationReason termReason = yulFuzzerUtil::interpret( os2, stack.parserResult()->code, EVMDialect::strictAssemblyForEVMObjects(version) ); + if (termReason == yulFuzzerUtil::TerminationReason::StepLimitReached) + return; + bool isTraceEq = (os1.str() == os2.str()); yulAssert(isTraceEq, "Interpreted traces for optimized and unoptimized code differ."); return;