diff options
author | chriseth <chris@ethereum.org> | 2018-11-30 01:33:54 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2018-11-30 23:30:19 +0800 |
commit | 4f992298c6381b3c7ea41462bce749850b5846e5 (patch) | |
tree | 0321eb675b2e8acc7c301221b0d731907443f936 /libsolidity | |
parent | 6d1644e55c03850341e6bfcc4ae46f8de264a039 (diff) | |
download | dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.tar dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.tar.gz dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.tar.bz2 dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.tar.lz dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.tar.xz dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.tar.zst dexon-solidity-4f992298c6381b3c7ea41462bce749850b5846e5.zip |
Move hash collisions checks.
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/analysis/ContractLevelChecker.cpp | 16 | ||||
-rw-r--r-- | libsolidity/analysis/ContractLevelChecker.h | 2 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 13 |
3 files changed, 18 insertions, 13 deletions
diff --git a/libsolidity/analysis/ContractLevelChecker.cpp b/libsolidity/analysis/ContractLevelChecker.cpp index e2208f3f..419ebe93 100644 --- a/libsolidity/analysis/ContractLevelChecker.cpp +++ b/libsolidity/analysis/ContractLevelChecker.cpp @@ -43,6 +43,7 @@ bool ContractLevelChecker::check(ContractDefinition const& _contract) checkConstructor(_contract); checkFallbackFunction(_contract); checkExternalTypeClashes(_contract); + checkHashCollisions(_contract); return Error::containsOnlyWarnings(m_errorReporter.errors()); } @@ -420,3 +421,18 @@ void ContractLevelChecker::checkExternalTypeClashes(ContractDefinition const& _c "Function overload clash during conversion to external types for arguments." ); } + +void ContractLevelChecker::checkHashCollisions(ContractDefinition const& _contract) +{ + set<FixedHash<4>> hashes; + for (auto const& it: _contract.interfaceFunctionList()) + { + FixedHash<4> const& hash = it.first; + if (hashes.count(hash)) + m_errorReporter.typeError( + _contract.location(), + string("Function signature hash collision for ") + it.second->externalSignature() + ); + hashes.insert(hash); + } +} diff --git a/libsolidity/analysis/ContractLevelChecker.h b/libsolidity/analysis/ContractLevelChecker.h index ef148617..f930fb60 100644 --- a/libsolidity/analysis/ContractLevelChecker.h +++ b/libsolidity/analysis/ContractLevelChecker.h @@ -75,6 +75,8 @@ private: /// Checks that different functions with external visibility end up having different /// external argument types (i.e. different signature). void checkExternalTypeClashes(ContractDefinition const& _contract); + /// Checks for hash collisions in external function signatures. + void checkHashCollisions(ContractDefinition const& _contract); langutil::ErrorReporter& m_errorReporter; }; diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index d107d2dc..e411609c 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -93,19 +93,6 @@ bool TypeChecker::visit(ContractDefinition const& _contract) for (auto const& n: _contract.subNodes()) n->accept(*this); - // check for hash collisions in function signatures - set<FixedHash<4>> hashes; - for (auto const& it: _contract.interfaceFunctionList()) - { - FixedHash<4> const& hash = it.first; - if (hashes.count(hash)) - m_errorReporter.typeError( - _contract.location(), - string("Function signature hash collision for ") + it.second->externalSignature() - ); - hashes.insert(hash); - } - if (_contract.isLibrary()) checkLibraryRequirements(_contract); |