From dea8b84e418eac6e24657fafaa9abd846512a623 Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Wed, 19 May 2021 10:38:00 +0200 Subject: [PATCH] Remove circular deps --- test/tools/ossfuzz/SolidityGenerator.cpp | 54 +++++++++++++++++------- test/tools/ossfuzz/SolidityGenerator.h | 34 +++++---------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/test/tools/ossfuzz/SolidityGenerator.cpp b/test/tools/ossfuzz/SolidityGenerator.cpp index f93108c55..dd06f2d2c 100644 --- a/test/tools/ossfuzz/SolidityGenerator.cpp +++ b/test/tools/ossfuzz/SolidityGenerator.cpp @@ -27,7 +27,6 @@ #include - using namespace solidity::test::fuzzer; using namespace solidity::test::fuzzer::mutator; using namespace solidity::util; @@ -38,6 +37,20 @@ GeneratorBase::GeneratorBase(SolidityGenerator* _mutator): state(_mutator->testS mutator = _mutator; } +template +std::shared_ptr GeneratorBase::generator() +{ + for (auto& g: generators) + if (std::holds_alternative>(g.first)) + return std::get>(g.first); + solAssert(false, ""); +} + +void GeneratorBase::addGenerators(set>&& _generators) +{ + generators = std::move(_generators); +} + string GeneratorBase::visitChildren() { ostringstream os; @@ -120,9 +133,8 @@ string TestState::randomNonCurrentPath() const void TestCaseGenerator::setup() { - addGenerators({ - {mutator->generator(), s_maxSourceUnits} - }); + set> dependsOn = {{mutator->generator(), s_maxSourceUnits}}; + addGenerators(std::move(dependsOn)); } string TestCaseGenerator::visit() @@ -132,12 +144,13 @@ string TestCaseGenerator::visit() void SourceUnitGenerator::setup() { - addGenerators({ + set> dependsOn = { {mutator->generator(), s_maxImports}, {mutator->generator(), 1}, {mutator->generator(), 1}, {mutator->generator(), s_maxFreeFunctions} - }); + }; + addGenerators(std::move(dependsOn)); } string SourceUnitGenerator::visit() @@ -207,9 +220,8 @@ string ImportGenerator::visit() void ContractGenerator::setup() { - addGenerators({ - {mutator->generator(), s_maxFunctions} - }); + set> dependsOn = {{mutator->generator(), s_maxFunctions}}; + addGenerators(std::move(dependsOn)); } string ContractGenerator::visit() @@ -415,11 +427,12 @@ string AssignmentStmtGenerator::visit() void StatementGenerator::setup() { - addGenerators({ + set> dependsOn = { {mutator->generator(), 1}, {mutator->generator(), 1}, {mutator->generator(), 1} - }); + }; + addGenerators(std::move(dependsOn)); } string StatementGenerator::visit() @@ -456,9 +469,8 @@ string StatementGenerator::visit() void BlockStmtGenerator::setup() { - addGenerators({ - {mutator->generator(), s_maxStatements}, - }); + set> dependsOn = {{mutator->generator(), s_maxStatements}}; + addGenerators(std::move(dependsOn)); } string BlockStmtGenerator::visit() @@ -490,7 +502,8 @@ string BlockStmtGenerator::visit() void FunctionGenerator::setup() { - addGenerators({{mutator->generator(), 1}}); + set> dependsOn = {{mutator->generator(), 1}}; + addGenerators(std::move(dependsOn)); } string FunctionGenerator::visit() @@ -1281,6 +1294,17 @@ SolidityGenerator::SolidityGenerator(unsigned _seed) m_state = make_shared(m_urd); } +SolidityGenerator::~SolidityGenerator() +{ + for (auto& g: m_generators) + std::visit(GenericVisitor{ + [&](auto const& _item) { return _item->teardown(); } + }, g); + m_generators.clear(); + m_urd.reset(); + m_state.reset(); +} + template void SolidityGenerator::createGenerators() { diff --git a/test/tools/ossfuzz/SolidityGenerator.h b/test/tools/ossfuzz/SolidityGenerator.h index 923ff1bee..7e07364a5 100644 --- a/test/tools/ossfuzz/SolidityGenerator.h +++ b/test/tools/ossfuzz/SolidityGenerator.h @@ -413,7 +413,6 @@ struct SourceState importedSources.clear(); freeFunctions.clear(); exports.clear(); - uRandDist.reset(); } /// Prints source state to @param _os. void print(std::ostream& _os) const; @@ -494,7 +493,6 @@ struct ContractState ~ContractState() { functions.clear(); - uRandDist.reset(); } void addFunction(std::shared_ptr _function) { @@ -649,7 +647,6 @@ struct TestState sourceUnitState.clear(); contractState.clear(); functionState.clear(); - uRandDist.reset(); } /// Prints test state to @param _os. void print(std::ostream& _os) const; @@ -842,12 +839,7 @@ class SolidityGenerator public: explicit SolidityGenerator(unsigned _seed); - ~SolidityGenerator() - { - m_generators.clear(); - m_urd.reset(); - m_state.reset(); - } + ~SolidityGenerator(); /// @returns the generator of type @param T. template @@ -869,8 +861,7 @@ private: template void createGenerator() { - auto generator = std::make_shared(this); - m_generators.insert(std::move(generator)); + m_generators.emplace(std::make_shared(this)); } template void createGenerators(); @@ -886,13 +877,8 @@ struct GeneratorBase { explicit GeneratorBase(SolidityGenerator* _mutator); template - std::shared_ptr generator() - { - for (auto& g: generators) - if (std::holds_alternative>(g.first)) - return std::get>(g.first); - solAssert(false, ""); - } + std::shared_ptr generator(); + /// @returns test fragment created by this generator. std::string generate() { @@ -918,20 +904,20 @@ struct GeneratorBase std::string visitChildren(); /// Adds generators for child grammar elements of /// this grammar element. - void addGenerators(std::set> _generators) - { - generators += std::move(_generators); - } + void addGenerators(std::set>&& _generators); + /// Virtual method to obtain string name of generator. - virtual std::string name() = 0; + virtual std::string name() { return {}; } /// Virtual method to add generators that this grammar /// element depends on. If not overridden, there are /// no dependencies. virtual void setup() {} - virtual ~GeneratorBase() + /// Remove generators. + void teardown() { generators.clear(); } + virtual ~GeneratorBase() {} std::shared_ptr& uRandDist() { return mutator->uniformRandomDist();