From c286cdaa6275442ed67dabd41b478cec5cf5b8ca Mon Sep 17 00:00:00 2001 From: Leonardo Alt Date: Fri, 6 Jul 2018 11:04:30 +0200 Subject: Fix crash for double variable declaration in the same scope. --- libsolidity/analysis/DeclarationContainer.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'libsolidity/analysis/DeclarationContainer.cpp') diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp index 786272e4..9e2bf6d3 100644 --- a/libsolidity/analysis/DeclarationContainer.cpp +++ b/libsolidity/analysis/DeclarationContainer.cpp @@ -96,6 +96,11 @@ void DeclarationContainer::activateVariable(ASTString const& _name) m_invisibleDeclarations.erase(_name); } +bool DeclarationContainer::isInvisible(ASTString const& _name) const +{ + return m_invisibleDeclarations.count(_name); +} + bool DeclarationContainer::registerDeclaration( Declaration const& _declaration, ASTString const* _name, -- cgit v1.2.3 From 30d9961efb7c0056a2b189b642489bee92048442 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Fri, 13 Jul 2018 13:20:39 +0200 Subject: Do not exclude public state variables when looking for conflicting declarations. --- libsolidity/analysis/DeclarationContainer.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'libsolidity/analysis/DeclarationContainer.cpp') diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp index 9e2bf6d3..59a3d522 100644 --- a/libsolidity/analysis/DeclarationContainer.cpp +++ b/libsolidity/analysis/DeclarationContainer.cpp @@ -49,16 +49,9 @@ Declaration const* DeclarationContainer::conflictingDeclaration( dynamic_cast(&_declaration) ) { - // check that all other declarations with the same name are functions or a public state variable or events. - // And then check that the signatures are different. + // check that all other declarations are of the same kind for (Declaration const* declaration: declarations) { - if (auto variableDeclaration = dynamic_cast(declaration)) - { - if (variableDeclaration->isStateVariable() && !variableDeclaration->isConstant() && variableDeclaration->isPublic()) - continue; - return declaration; - } if ( dynamic_cast(&_declaration) && !dynamic_cast(declaration) -- cgit v1.2.3 From ce7c7aca798bd11f51e23ef0ff104405d09fb220 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Mon, 16 Jul 2018 17:00:47 +0200 Subject: Extend code comment about signatures. --- libsolidity/analysis/DeclarationContainer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libsolidity/analysis/DeclarationContainer.cpp') diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp index 59a3d522..347daaf8 100644 --- a/libsolidity/analysis/DeclarationContainer.cpp +++ b/libsolidity/analysis/DeclarationContainer.cpp @@ -49,7 +49,8 @@ Declaration const* DeclarationContainer::conflictingDeclaration( dynamic_cast(&_declaration) ) { - // check that all other declarations are of the same kind + // check that all other declarations are of the same kind (in which + // case the type checker will ensure that the signatures are different) for (Declaration const* declaration: declarations) { if ( -- cgit v1.2.3 From 3fa8829845bf55df812f81356a3ec43149836bb5 Mon Sep 17 00:00:00 2001 From: bakaoh Date: Fri, 10 Aug 2018 17:31:19 +0700 Subject: Fixes #4718: High CPU usage when using large variable names --- libsolidity/analysis/DeclarationContainer.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'libsolidity/analysis/DeclarationContainer.cpp') diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp index 347daaf8..5f980788 100644 --- a/libsolidity/analysis/DeclarationContainer.cpp +++ b/libsolidity/analysis/DeclarationContainer.cpp @@ -138,19 +138,22 @@ vector DeclarationContainer::resolveName(ASTString const& _n vector DeclarationContainer::similarNames(ASTString const& _name) const { static size_t const MAXIMUM_EDIT_DISTANCE = 2; + // because the function below has quadratic runtime - it will not magically improve once a better algorithm is discovered ;) + // since 80 is the suggested line length limit, we use 80^2 as length threshold + static size_t const MAXIMUM_LENGTH_THRESHOLD = 80 * 80; vector similar; for (auto const& declaration: m_declarations) { string const& declarationName = declaration.first; - if (stringWithinDistance(_name, declarationName, MAXIMUM_EDIT_DISTANCE)) + if (stringWithinDistance(_name, declarationName, MAXIMUM_EDIT_DISTANCE, MAXIMUM_LENGTH_THRESHOLD)) similar.push_back(declarationName); } for (auto const& declaration: m_invisibleDeclarations) { string const& declarationName = declaration.first; - if (stringWithinDistance(_name, declarationName, MAXIMUM_EDIT_DISTANCE)) + if (stringWithinDistance(_name, declarationName, MAXIMUM_EDIT_DISTANCE, MAXIMUM_LENGTH_THRESHOLD)) similar.push_back(declarationName); } -- cgit v1.2.3 From 1ce9566e504f3ce14978a9df5e8b37b74e6f621e Mon Sep 17 00:00:00 2001 From: mestorlx Date: Thu, 11 Oct 2018 18:21:49 -0300 Subject: Updated MAXIMUM_STRING_DISTANCE to non static maximumStringDistance taking into account length of the identifier --- libsolidity/analysis/DeclarationContainer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'libsolidity/analysis/DeclarationContainer.cpp') diff --git a/libsolidity/analysis/DeclarationContainer.cpp b/libsolidity/analysis/DeclarationContainer.cpp index 5f980788..cf12a49d 100644 --- a/libsolidity/analysis/DeclarationContainer.cpp +++ b/libsolidity/analysis/DeclarationContainer.cpp @@ -137,23 +137,23 @@ vector DeclarationContainer::resolveName(ASTString const& _n vector DeclarationContainer::similarNames(ASTString const& _name) const { - static size_t const MAXIMUM_EDIT_DISTANCE = 2; + // because the function below has quadratic runtime - it will not magically improve once a better algorithm is discovered ;) // since 80 is the suggested line length limit, we use 80^2 as length threshold static size_t const MAXIMUM_LENGTH_THRESHOLD = 80 * 80; vector similar; - + size_t maximumEditDistance = _name.size() > 3 ? 2 : _name.size() / 2; for (auto const& declaration: m_declarations) { string const& declarationName = declaration.first; - if (stringWithinDistance(_name, declarationName, MAXIMUM_EDIT_DISTANCE, MAXIMUM_LENGTH_THRESHOLD)) + if (stringWithinDistance(_name, declarationName, maximumEditDistance, MAXIMUM_LENGTH_THRESHOLD)) similar.push_back(declarationName); } for (auto const& declaration: m_invisibleDeclarations) { string const& declarationName = declaration.first; - if (stringWithinDistance(_name, declarationName, MAXIMUM_EDIT_DISTANCE, MAXIMUM_LENGTH_THRESHOLD)) + if (stringWithinDistance(_name, declarationName, maximumEditDistance, MAXIMUM_LENGTH_THRESHOLD)) similar.push_back(declarationName); } -- cgit v1.2.3