aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-11-30 01:33:54 +0800
committerchriseth <chris@ethereum.org>2018-11-30 23:30:19 +0800
commit4f992298c6381b3c7ea41462bce749850b5846e5 (patch)
tree0321eb675b2e8acc7c301221b0d731907443f936 /libsolidity
parent6d1644e55c03850341e6bfcc4ae46f8de264a039 (diff)
downloaddexon-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.cpp16
-rw-r--r--libsolidity/analysis/ContractLevelChecker.h2
-rw-r--r--libsolidity/analysis/TypeChecker.cpp13
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);