From e90248c136765c2b7fc882d3472e777e797dfe9b Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Tue, 9 Feb 2021 16:46:16 +0100 Subject: [PATCH] Enable abi pragmas and fix formatting. --- test/tools/ossfuzz/SolidityGenerator.cpp | 19 ++++++++----------- test/tools/ossfuzz/SolidityGenerator.h | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/test/tools/ossfuzz/SolidityGenerator.cpp b/test/tools/ossfuzz/SolidityGenerator.cpp index f5975b64e..6a1e534e8 100644 --- a/test/tools/ossfuzz/SolidityGenerator.cpp +++ b/test/tools/ossfuzz/SolidityGenerator.cpp @@ -133,15 +133,12 @@ string SourceUnitGenerator::visit() string PragmaGenerator::visit() { - static constexpr const char* preamble = R"( - pragma solidity >= 0.0.0; - pragma experimental SMTChecker; - )"; - // Choose equally at random from coder v1 and v2 - string abiPragma = "pragma abicoder v" + - to_string(uRandDist->distributionOneToN(2)) + - ";\n"; - return preamble + abiPragma; + set pragmas = uRandDist->subset(s_genericPragmas); + // Choose either abicoder v1 or v2 but not both. + pragmas.insert(s_abiPragmas[uRandDist->distributionOneToN(s_abiPragmas.size()) - 1]); + ostringstream pragmaString; + copy(pragmas.begin(), pragmas.end(), ostream_iterator(pragmaString, "\n")); + return pragmaString.str() + "\n"; } string ImportGenerator::visit() @@ -160,7 +157,7 @@ string ImportGenerator::visit() os << "import " << "\"" << state->randomPath() - << "\";"; + << "\";\n"; } else { @@ -169,7 +166,7 @@ string ImportGenerator::visit() os << "import " << "\"" << state->randomNonCurrentPath() - << "\";"; + << "\";\n"; } return os.str(); } diff --git a/test/tools/ossfuzz/SolidityGenerator.h b/test/tools/ossfuzz/SolidityGenerator.h index 6b8a535f8..229fc04a0 100644 --- a/test/tools/ossfuzz/SolidityGenerator.h +++ b/test/tools/ossfuzz/SolidityGenerator.h @@ -77,6 +77,20 @@ struct UniformRandomDistribution solAssert(_n > 0, ""); return distributionOneToN(_n) == 1; } + /// @returns a subset whose elements are of type @param T + /// created from the set @param _container using + /// uniform selection. + template + std::set subset(std::set const& _container) + { + size_t s = _container.size(); + solAssert(s > 1, ""); + std::set subContainer; + for (auto const& item: _container) + if (probable(s)) + subContainer.insert(item); + return subContainer; + } std::unique_ptr randomEngine; }; @@ -231,6 +245,15 @@ public: {} std::string visit() override; std::string name() override { return "Pragma generator"; } +private: + std::set const s_genericPragmas = { + R"(pragma solidity >= 0.0.0;)", + R"(pragma experimental SMTChecker;)", + }; + std::vector const s_abiPragmas = { + R"(pragma abicoder v1;)", + R"(pragma abicoder v2;)" + }; }; class ImportGenerator: public GeneratorBase