From 18b0c021bc17cd681ea1a8f687be046802280d4d Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Thu, 22 Apr 2021 17:43:36 +0200 Subject: [PATCH] Contract changes --- test/tools/ossfuzz/SolidityGenerator.cpp | 4 ++- test/tools/ossfuzz/SolidityGenerator.h | 45 +++++++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/test/tools/ossfuzz/SolidityGenerator.cpp b/test/tools/ossfuzz/SolidityGenerator.cpp index 40bc8fbb9..cb89ed756 100644 --- a/test/tools/ossfuzz/SolidityGenerator.cpp +++ b/test/tools/ossfuzz/SolidityGenerator.cpp @@ -187,7 +187,9 @@ string ImportGenerator::visit() string ContractGenerator::visit() { - return "contract C {}\n"; + string name = state->newContract(); + state->updateContract(name); + return "contract " + name + " {}\n"; } template diff --git a/test/tools/ossfuzz/SolidityGenerator.h b/test/tools/ossfuzz/SolidityGenerator.h index 9b727ea2d..f51f85ce7 100644 --- a/test/tools/ossfuzz/SolidityGenerator.h +++ b/test/tools/ossfuzz/SolidityGenerator.h @@ -103,6 +103,15 @@ struct UniformRandomDistribution std::unique_ptr randomEngine; }; +struct ContractState +{ + explicit ContractState(std::shared_ptr _urd): + uRandDist(std::move(_urd)) + {} + + std::shared_ptr uRandDist; +}; + struct SourceState { explicit SourceState(std::shared_ptr _urd): @@ -131,9 +140,11 @@ struct TestState { explicit TestState(std::shared_ptr _urd): sourceUnitState({}), + contractState({}), currentSourceUnitPath({}), uRandDist(std::move(_urd)), - numSourceUnits(0) + numSourceUnits(0), + numContracts(0) {} /// Adds @param _path to @name sourceUnitPaths updates /// @name currentSourceUnitPath. @@ -142,6 +153,13 @@ struct TestState sourceUnitState.emplace(_path, std::make_shared(uRandDist)); currentSourceUnitPath = _path; } + /// Adds @param _name to @name contractState updates + /// @name currentContract. + void addContract(std::string const& _name) + { + contractState.emplace(_name, std::make_shared(uRandDist)); + currentContract = _name; + } /// Returns true if @name sourceUnitPaths is empty, /// false otherwise. [[nodiscard]] bool empty() const @@ -161,6 +179,10 @@ struct TestState { return sourceUnitNamePrefix + std::to_string(numSourceUnits) + ".sol"; } + [[nodiscard]] std::string newContract() const + { + return contractPrefix + std::to_string(numContracts); + } [[nodiscard]] std::string currentPath() const { solAssert(numSourceUnits > 0, ""); @@ -173,7 +195,13 @@ struct TestState addSourceUnit(_path); numSourceUnits++; } - /// Adds a new source unit to test case. + /// Adds @param _contract to list of contracts in global test state and + /// increments @name numContracts + void updateContract(std::string const& _name) + { + addContract(_name); + numContracts++; + } void addSource() { updateSourcePath(newPath()); @@ -181,6 +209,7 @@ struct TestState ~TestState() { sourceUnitState.clear(); + contractState.clear(); } /// Prints test state to @param _os. void print(std::ostream& _os) const; @@ -191,16 +220,24 @@ struct TestState [[nodiscard]] std::string randomPath() const; /// Returns a randomly chosen non current source unit path. [[nodiscard]] std::string randomNonCurrentPath() const; - /// List of source paths in test input. + /// Map of source name -> state std::map> sourceUnitState; + /// Map of contract name -> state + std::map> contractState; /// Source path being currently visited. std::string currentSourceUnitPath; + /// Current contract + std::string currentContract; /// Uniform random distribution. std::shared_ptr uRandDist; /// Number of source units in test input size_t numSourceUnits; - /// String prefix of source unit names + /// Number of contracts in test input + size_t numContracts; + /// Source name prefix std::string const sourceUnitNamePrefix = "su"; + /// Contract name prefix + std::string const contractPrefix = "C"; }; struct GeneratorBase