Skip to content

Commit 6326b86

Browse files
authored
Merge pull request #15954 from ethereum/ossfuzz_use_ast_over_block
ossfuzz and Yul interpreter use ast over block
2 parents e134620 + dafe006 commit 6326b86

10 files changed

+25
-35
lines changed

test/libyul/YulInterpreterTest.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ std::string YulInterpreterTest::interpret(std::shared_ptr<Object const> const& _
8080
{
8181
Interpreter::run(
8282
state,
83-
*_object->dialect(),
84-
_object->code()->root(),
83+
*_object->code(),
8584
/*disableExternalCalls=*/ !m_simulateExternalCallsToSelf,
8685
/*disableMemoryTracing=*/ false
8786
);

test/tools/ossfuzz/strictasm_diff_ossfuzz.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
9090
// TODO: Add EOF support
9191
yulFuzzerUtil::TerminationReason termReason = yulFuzzerUtil::interpret(
9292
os1,
93-
stack.parserResult()->code()->root(),
94-
EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion(), std::nullopt),
93+
*stack.parserResult()->code(),
9594
/*disableMemoryTracing=*/true
9695
);
9796
if (yulFuzzerUtil::resourceLimitsExceeded(termReason))
@@ -100,8 +99,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
10099
stack.optimize();
101100
termReason = yulFuzzerUtil::interpret(
102101
os2,
103-
stack.parserResult()->code()->root(),
104-
EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion(), std::nullopt),
102+
*stack.parserResult()->code(),
105103
/*disableMemoryTracing=*/true
106104
);
107105

test/tools/ossfuzz/yulFuzzerCommon.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ using namespace solidity::yul::test::yul_fuzzer;
2323

2424
yulFuzzerUtil::TerminationReason yulFuzzerUtil::interpret(
2525
std::ostream& _os,
26-
yul::Block const& _astRoot,
27-
Dialect const& _dialect,
26+
AST const& _ast,
2827
bool _disableMemoryTracing,
2928
bool _outputStorageOnly,
3029
size_t _maxSteps,
@@ -52,7 +51,7 @@ yulFuzzerUtil::TerminationReason yulFuzzerUtil::interpret(
5251
TerminationReason reason = TerminationReason::None;
5352
try
5453
{
55-
Interpreter::run(state, _dialect, _astRoot, true, _disableMemoryTracing);
54+
Interpreter::run(state, _ast, true, _disableMemoryTracing);
5655
}
5756
catch (StepLimitReached const&)
5857
{

test/tools/ossfuzz/yulFuzzerCommon.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ struct yulFuzzerUtil
4040
/// eliminator.
4141
static TerminationReason interpret(
4242
std::ostream& _os,
43-
yul::Block const& _astRoot,
44-
Dialect const& _dialect,
43+
AST const& _ast,
4544
bool _disableMemoryTracing = false,
4645
bool _outputStorageOnly = false,
4746
size_t _maxSteps = maxSteps,

test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ DEFINE_PROTO_FUZZER(Program const& _input)
9090
// TODO: Add EOF support
9191
yulFuzzerUtil::TerminationReason termReason = yulFuzzerUtil::interpret(
9292
os1,
93-
stack.parserResult()->code()->root(),
94-
EVMDialect::strictAssemblyForEVMObjects(version, std::nullopt),
93+
*stack.parserResult()->code(),
9594
/*disableMemoryTracing=*/true
9695
);
9796

@@ -106,8 +105,7 @@ DEFINE_PROTO_FUZZER(Program const& _input)
106105
// TODO: Add EOF support
107106
termReason = yulFuzzerUtil::interpret(
108107
os2,
109-
*astRoot,
110-
EVMDialect::strictAssemblyForEVMObjects(version, std::nullopt),
108+
*optimizerTest.optimizedObject()->code(),
111109
true
112110
);
113111
if (yulFuzzerUtil::resourceLimitsExceeded(termReason))

test/tools/yulInterpreter/Inspector.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ using namespace solidity::yul::test;
3131
namespace
3232
{
3333

34-
void printVariable(YulString const& _name, u256 const& _value)
34+
void printVariable(std::string_view const _name, u256 const& _value)
3535
{
36-
std::cout << "\t" << _name.str() << " = " << _value.str();
36+
std::cout << "\t" << _name << " = " << _value.str();
3737

3838
if (_value != 0)
3939
std::cout << " (" << toCompactHexWithPrefix(_value) << ")";
@@ -46,17 +46,16 @@ void printVariable(YulString const& _name, u256 const& _value)
4646
void InspectedInterpreter::run(
4747
std::shared_ptr<Inspector> _inspector,
4848
InterpreterState& _state,
49-
Dialect const& _dialect,
50-
Block const& _ast,
49+
AST const& _ast,
5150
bool _disableExternalCalls,
5251
bool _disableMemoryTrace
5352
)
5453
{
5554
Scope scope;
56-
InspectedInterpreter{_inspector, _state, _dialect, scope, _disableExternalCalls, _disableMemoryTrace}(_ast);
55+
InspectedInterpreter{_inspector, _state, _ast.dialect(), scope, _disableExternalCalls, _disableMemoryTrace}(_ast.root());
5756
}
5857

59-
Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std::map<YulString, u256> const& _variables)
58+
Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std::map<YulName, u256> const& _variables)
6059
{
6160
if (m_stepMode == NodeAction::RunNode)
6261
{
@@ -99,7 +98,7 @@ Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std
9998
else if (input == "variables" || input == "v")
10099
{
101100
for (auto &&[yulStr, val]: _variables)
102-
printVariable(yulStr, val);
101+
printVariable(yulStr.str(), val);
103102
std::cout << std::endl;
104103
}
105104
else if (
@@ -120,7 +119,7 @@ Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std
120119
for (auto &&[yulStr, val]: _variables)
121120
if (yulStr.str() == varname)
122121
{
123-
printVariable(yulStr, val);
122+
printVariable(varname, val);
124123
found = true;
125124
break;
126125
}

test/tools/yulInterpreter/Inspector.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ class InspectedInterpreter: public Interpreter
103103
static void run(
104104
std::shared_ptr<Inspector> _inspector,
105105
InterpreterState& _state,
106-
Dialect const& _dialect,
107-
Block const& _ast,
106+
AST const& _ast,
108107
bool _disableExternalCalls,
109108
bool _disableMemoryTracing
110109
);

test/tools/yulInterpreter/Interpreter.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,13 @@ void InterpreterState::dumpTraceAndState(std::ostream& _out, bool _disableMemory
109109

110110
void Interpreter::run(
111111
InterpreterState& _state,
112-
Dialect const& _dialect,
113-
Block const& _ast,
112+
AST const& _ast,
114113
bool _disableExternalCalls,
115114
bool _disableMemoryTrace
116115
)
117116
{
118117
Scope scope;
119-
Interpreter{_state, _dialect, scope, _disableExternalCalls, _disableMemoryTrace}(_ast);
118+
Interpreter{_state, _ast.dialect(), scope, _disableExternalCalls, _disableMemoryTrace}(_ast.root());
120119
}
121120

122121
void Interpreter::operator()(ExpressionStatement const& _expressionStatement)

test/tools/yulInterpreter/Interpreter.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#pragma once
2323

2424
#include <libyul/ASTForward.h>
25+
#include <libyul/backends/evm/EVMDialect.h>
2526
#include <libyul/optimiser/ASTWalker.h>
2627

2728
#include <libevmasm/Instruction.h>
@@ -162,8 +163,7 @@ class Interpreter: public ASTWalker
162163
/// activated e.g., Redundant store eliminator, Equal store eliminator.
163164
static void run(
164165
InterpreterState& _state,
165-
Dialect const& _dialect,
166-
Block const& _ast,
166+
AST const& _ast,
167167
bool _disableExternalCalls,
168168
bool _disableMemoryTracing
169169
);

test/tools/yulrun.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ std::pair<std::shared_ptr<AST const>, std::shared_ptr<AsmAnalysisInfo>> parse(st
6363
solidity::frontend::OptimiserSettings::none(),
6464
DebugInfoSelection::Default()
6565
);
66+
auto const* evmDialect = dynamic_cast<EVMDialect const*>(&stack.dialect());
67+
// TODO: Add EOF support
68+
solUnimplementedAssert(evmDialect && !evmDialect->eofVersion(), "No EOF support for yulrun yet.");
6669
if (stack.parseAndAnalyze("--INPUT--", _source))
6770
{
6871
yulAssert(!Error::hasErrorsWarningsOrInfos(stack.errors()), "Parsed successfully but had errors.");
@@ -87,13 +90,10 @@ void interpret(std::string const& _source, bool _inspect, bool _disableExternalC
8790
state.maxTraceSize = 10000;
8891
try
8992
{
90-
Dialect const& dialect(EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion{}, std::nullopt));
91-
9293
if (_inspect)
93-
InspectedInterpreter::run(std::make_shared<Inspector>(_source, state), state, dialect, ast->root(), _disableExternalCalls, /*disableMemoryTracing=*/false);
94-
94+
InspectedInterpreter::run(std::make_shared<Inspector>(_source, state), state, *ast, _disableExternalCalls, /*disableMemoryTracing=*/false);
9595
else
96-
Interpreter::run(state, dialect, ast->root(), _disableExternalCalls, /*disableMemoryTracing=*/false);
96+
Interpreter::run(state, *ast, _disableExternalCalls, /*disableMemoryTracing=*/false);
9797
}
9898
catch (InterpreterTerminatedGeneric const&)
9999
{

0 commit comments

Comments
 (0)