From 85b67eba85a5f283888c97a75d2d84b9e5533fc0 Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Mon, 13 Apr 2020 21:04:27 +0200 Subject: [PATCH] Change function numbering --- test/tools/ossfuzz/SolProtoAdaptor.cpp | 49 ++++++++++++++++++-------- test/tools/ossfuzz/SolProtoAdaptor.h | 17 +++++++-- test/tools/ossfuzz/protoToSol.cpp | 10 +++--- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/test/tools/ossfuzz/SolProtoAdaptor.cpp b/test/tools/ossfuzz/SolProtoAdaptor.cpp index be6985d08..eadf63870 100644 --- a/test/tools/ossfuzz/SolProtoAdaptor.cpp +++ b/test/tools/ossfuzz/SolProtoAdaptor.cpp @@ -324,14 +324,23 @@ string SolBaseContract::name() } } -SolBaseContract::SolBaseContract(ProtoBaseContract _base, string _name, shared_ptr _prng) +SolBaseContract::SolBaseContract( + ProtoBaseContract _base, + string _name, + unsigned _startFunctionIndex, + shared_ptr _prng +) { if (holds_alternative(_base)) - m_base = make_shared(SolContract(*get(_base), _name, _prng)); + m_base = make_shared( + SolContract(*get(_base), _name, _startFunctionIndex, _prng) + ); else { solAssert(holds_alternative(_base), "Sol proto adaptor: Invalid base contract"); - m_base = make_shared(SolInterface(*get(_base), _name, _prng)); + m_base = make_shared( + SolInterface(*get(_base), _name, _startFunctionIndex, _prng) + ); } } @@ -458,7 +467,7 @@ void SolInterface::addBases(Interface const& _interface) { for (auto &b: _interface.bases()) { - auto base = make_shared(SolInterface(b, newBaseName(), m_prng)); + auto base = make_shared(SolInterface(b, newBaseName(), m_functionIndex, m_prng)); m_baseInterfaces.push_back(base); // Worst case, we override all base functions so we // increment derived contract's function index by @@ -481,11 +490,17 @@ void SolInterface::addFunctions(Interface const& _interface) ); } -SolInterface::SolInterface(Interface const& _interface, string _name, shared_ptr _prng) +SolInterface::SolInterface( + Interface const& _interface, + string _name, + unsigned _startFunctionIndex, + shared_ptr _prng +) { m_prng = _prng; m_interfaceName = _name; m_lastBaseName = m_interfaceName; + m_functionIndex = _startFunctionIndex; addBases(_interface); addOverrides(); addFunctions(_interface); @@ -938,17 +953,17 @@ void SolContract::addFunctions(Contract const& _contract) } } -void SolContract::disallowedBase(shared_ptr _base) +void SolContract::disallowedBase(shared_ptr _base1) { if (m_baseContracts.size() == 0) return; shared_ptr lastBase = m_baseContracts[m_baseContracts.size() - 1]; - auto baseType = _base->type(); + auto baseType = _base1->type(); auto lastBaseType = lastBase->type(); if (baseType == SolBaseContract::BaseType::INTERFACE && lastBaseType == SolBaseContract::BaseType::INTERFACE) { - for (auto &bf: _base->interface()->m_interfaceFunctions) + for (auto &bf: _base1->interface()->m_interfaceFunctions) for (auto &lbf: lastBase->interface()->m_interfaceFunctions) assertThrow( bf != lbf, @@ -959,7 +974,7 @@ void SolContract::disallowedBase(shared_ptr _base) } else if (baseType == SolBaseContract::BaseType::INTERFACE && lastBaseType == SolBaseContract::BaseType::CONTRACT) { - for (auto &bf: _base->interface()->m_interfaceFunctions) + for (auto &bf: _base1->interface()->m_interfaceFunctions) for (auto &lbf: lastBase->contract()->m_contractFunctions) if (bf->name() == lbf->name() && ((bf->mutability() != lbf->mutability()) || (lbf->visibility() != SolFunctionVisibility::EXTERNAL))) @@ -972,7 +987,7 @@ void SolContract::disallowedBase(shared_ptr _base) } else if (baseType == SolBaseContract::BaseType::CONTRACT && lastBaseType == SolBaseContract::BaseType::INTERFACE) { - for (auto &bf: _base->contract()->m_contractFunctions) + for (auto &bf: _base1->contract()->m_contractFunctions) for (auto &lbf: lastBase->interface()->m_interfaceFunctions) if (bf->name() == lbf->name() && ((bf->mutability() != lbf->mutability()) || (bf->visibility() != SolFunctionVisibility::EXTERNAL))) @@ -985,7 +1000,7 @@ void SolContract::disallowedBase(shared_ptr _base) } else { - for (auto &bf: _base->contract()->m_contractFunctions) + for (auto &bf: _base1->contract()->m_contractFunctions) for (auto &lbf: lastBase->contract()->m_contractFunctions) assertThrow( bf != lbf, @@ -1004,10 +1019,14 @@ void SolContract::addBases(Contract const& _contract) switch (b.contract_or_interface_oneof_case()) { case ContractOrInterface::kC: - base = make_shared(SolBaseContract(&b.c(), newBaseName(), m_prng)); + base = make_shared( + SolBaseContract(&b.c(), newBaseName(), m_functionIndex, m_prng) + ); break; case ContractOrInterface::kI: - base = make_shared(SolBaseContract(&b.i(), newBaseName(), m_prng)); + base = make_shared( + SolBaseContract(&b.i(), newBaseName(), m_functionIndex, m_prng) + ); break; case ContractOrInterface::CONTRACT_OR_INTERFACE_ONEOF_NOT_SET: continue; @@ -1015,7 +1034,7 @@ void SolContract::addBases(Contract const& _contract) // Check if new base defines a namesake function with different // visibility and/or state mutability in relation to previous // base - disallowedBase(base); +// disallowedBase(base); m_baseContracts.push_back(base); // Worst case, we override all base functions so we // increment derived contract's function index by @@ -1160,12 +1179,14 @@ string SolContract::str() const SolContract::SolContract( Contract const& _contract, std::string _name, + unsigned _startFunctionIndex, shared_ptr _prng ) { m_prng = _prng; m_contractName = _name; m_lastBaseName = m_contractName; + m_functionIndex = _startFunctionIndex; m_abstract = _contract.abstract(); addBases(_contract); addOverrides(); diff --git a/test/tools/ossfuzz/SolProtoAdaptor.h b/test/tools/ossfuzz/SolProtoAdaptor.h index d00784155..43b260f85 100644 --- a/test/tools/ossfuzz/SolProtoAdaptor.h +++ b/test/tools/ossfuzz/SolProtoAdaptor.h @@ -248,7 +248,12 @@ struct SolBaseContract CONTRACT }; - SolBaseContract(ProtoBaseContract _base, std::string _name, std::shared_ptr _prng); + SolBaseContract( + ProtoBaseContract _base, + std::string _name, + unsigned _startFunctionIndex, + std::shared_ptr _prng + ); std::variant>, std::vector>> baseFunctions(); @@ -273,7 +278,12 @@ struct SolBaseContract struct SolContract { - SolContract(Contract const& _contract, std::string _name, std::shared_ptr _prng); + SolContract( + Contract const& _contract, + std::string _name, + unsigned _startFunctionIndex, + std::shared_ptr _prng + ); std::string str() const; std::string interfaceOverrideStr() const; @@ -289,7 +299,7 @@ struct SolContract std::shared_ptr _base, std::shared_ptr _function ); - void disallowedBase(std::shared_ptr _base); + void disallowedBase(std::shared_ptr _base1); bool validTest() const; std::string baseNames() const; @@ -355,6 +365,7 @@ struct SolInterface SolInterface( Interface const& _interface, std::string _interfaceName, + unsigned _startFunctionIndex, std::shared_ptr _prng ); diff --git a/test/tools/ossfuzz/protoToSol.cpp b/test/tools/ossfuzz/protoToSol.cpp index 56b93af57..cb721f2dc 100644 --- a/test/tools/ossfuzz/protoToSol.cpp +++ b/test/tools/ossfuzz/protoToSol.cpp @@ -158,7 +158,7 @@ string ProtoConverter::visit(Contract const& _contract) openProgramScope(&_contract); try { - auto contract = SolContract(_contract, programName(&_contract), m_randomGen); + auto contract = SolContract(_contract, programName(&_contract), 0, m_randomGen); if (contract.validTest()) { m_contractTests.push_back(contract.pseudoRandomTest()); @@ -169,8 +169,9 @@ string ProtoConverter::visit(Contract const& _contract) else return ""; } - catch (langutil::FuzzerError const&) + catch (langutil::FuzzerError const& error) { + cout << error.what() << endl; // Return empty string if input specification is invalid. return ""; } @@ -183,11 +184,12 @@ string ProtoConverter::visit(Interface const& _interface) openProgramScope(&_interface); try { - auto interface = SolInterface(_interface, programName(&_interface), m_randomGen); + auto interface = SolInterface(_interface, programName(&_interface), 0, m_randomGen); return interface.str(); } - catch (langutil::FuzzerError const&) + catch (langutil::FuzzerError const& error) { + cout << error.what() << endl; // Return empty string if input specification is invalid. return ""; }