diff options
author | Christian <c@ethdev.com> | 2015-01-14 17:16:58 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2015-01-14 17:16:58 +0800 |
commit | 6e16107870494878635da347146b076a7d75dea0 (patch) | |
tree | b797f8b57a875198b634d0e9ee145f8306c86d62 /AST.cpp | |
parent | 80eec8b308e8af3b742e3da47ded927e4e4b388d (diff) | |
download | dexon-solidity-6e16107870494878635da347146b076a7d75dea0.tar dexon-solidity-6e16107870494878635da347146b076a7d75dea0.tar.gz dexon-solidity-6e16107870494878635da347146b076a7d75dea0.tar.bz2 dexon-solidity-6e16107870494878635da347146b076a7d75dea0.tar.lz dexon-solidity-6e16107870494878635da347146b076a7d75dea0.tar.xz dexon-solidity-6e16107870494878635da347146b076a7d75dea0.tar.zst dexon-solidity-6e16107870494878635da347146b076a7d75dea0.zip |
Check for hash collisions already before compiling.
Diffstat (limited to 'AST.cpp')
-rw-r--r-- | AST.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
@@ -50,18 +50,27 @@ void ContractDefinition::checkTypeRequirements() for (ASTPointer<FunctionDefinition> const& function: getDefinedFunctions()) function->checkTypeRequirements(); + + // check for hash collisions in function signatures + vector<pair<FixedHash<4>, FunctionDefinition const*>> exportedFunctionList = getInterfaceFunctionList(); + set<FixedHash<4>> hashes; + for (auto const& hashAndFunction: getInterfaceFunctionList()) + { + FixedHash<4> const& hash = hashAndFunction.first; + if (hashes.count(hash)) + BOOST_THROW_EXCEPTION(createTypeError("Function signature hash collision for " + + hashAndFunction.second->getCanonicalSignature())); + hashes.insert(hash); + } } map<FixedHash<4>, FunctionDefinition const*> ContractDefinition::getInterfaceFunctions() const { - map<FixedHash<4>, FunctionDefinition const*> exportedFunctions; - for (ASTPointer<FunctionDefinition> const& f: m_definedFunctions) - if (f->isPublic() && f->getName() != getName()) - { - FixedHash<4> hash(dev::sha3(f->getCanonicalSignature())); - auto res = exportedFunctions.insert(std::make_pair(hash,f.get())); - solAssert(res.second, "Hash collision at Function Definition Hash calculation"); - } + vector<pair<FixedHash<4>, FunctionDefinition const*>> exportedFunctionList = getInterfaceFunctionList(); + map<FixedHash<4>, FunctionDefinition const*> exportedFunctions(exportedFunctionList.begin(), + exportedFunctionList.end()); + solAssert(exportedFunctionList.size() == exportedFunctions.size(), + "Hash collision at Function Definition Hash calculation"); return exportedFunctions; } @@ -74,6 +83,19 @@ FunctionDefinition const* ContractDefinition::getConstructor() const return nullptr; } +vector<pair<FixedHash<4>, FunctionDefinition const*>> ContractDefinition::getInterfaceFunctionList() const +{ + vector<pair<FixedHash<4>, FunctionDefinition const*>> exportedFunctions; + for (ASTPointer<FunctionDefinition> const& f: m_definedFunctions) + if (f->isPublic() && f->getName() != getName()) + { + FixedHash<4> hash(dev::sha3(f->getCanonicalSignature())); + exportedFunctions.push_back(make_pair(hash, f.get())); + } + + return exportedFunctions; +} + void StructDefinition::checkMemberTypes() const { for (ASTPointer<VariableDeclaration> const& member: getMembers()) |