From 9ce1ded86f03881aa830b0dd4eb21fbdfdb4191f Mon Sep 17 00:00:00 2001 From: wechman Date: Wed, 21 Sep 2022 09:58:12 +0200 Subject: [PATCH] Updates after code review --- docs/grammar/SolidityParser.g4 | 4 ++-- libsolidity/analysis/ControlFlowBuilder.cpp | 5 ++++- libsolidity/analysis/ControlFlowGraph.cpp | 4 ---- libsolidity/analysis/ControlFlowGraph.h | 4 ++-- libsolidity/analysis/FunctionCallGraph.cpp | 6 ++++++ 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/grammar/SolidityParser.g4 b/docs/grammar/SolidityParser.g4 index f384d571b..93e1574c4 100644 --- a/docs/grammar/SolidityParser.g4 +++ b/docs/grammar/SolidityParser.g4 @@ -312,7 +312,7 @@ errorDefinition: Semicolon; /** - * User type operators. + * Customizable operators of user-defined types. */ userOp: Add | Sub | Mul | Div | Mod | BitAnd | BitOr | BitXor | BitNot | Equal | NotEqual | LessThan | GreaterThan | LessThanOrEqual | GreaterThanOrEqual | Shl | Sar | Exp | Not; @@ -320,7 +320,7 @@ userOp: Add | Sub | Mul | Div | Mod | BitAnd | BitOr | BitXor | BitNot | Equal | * Using directive to bind library functions and free functions to types. * Can occur within contracts and libraries and at the file level. */ -usingDirective: Using (identifierPath (As userOp)? | (LBrace identifierPath (As userOp)? (Comma identifierPath (As userOp)?)* RBrace)) For (Mul | typeName) Global? Semicolon; +usingDirective: Using (identifierPath | (LBrace identifierPath (As userOp)? (Comma identifierPath (As userOp)?)* RBrace)) For (Mul | typeName) Global? Semicolon; /** * A type name can be an elementary type, a function type, a mapping type, a user-defined type * (e.g. a contract or struct) or an array type. diff --git a/libsolidity/analysis/ControlFlowBuilder.cpp b/libsolidity/analysis/ControlFlowBuilder.cpp index 0c4bcfef3..858c3a2d6 100644 --- a/libsolidity/analysis/ControlFlowBuilder.cpp +++ b/libsolidity/analysis/ControlFlowBuilder.cpp @@ -81,6 +81,7 @@ bool ControlFlowBuilder::visit(BinaryOperation const& _operation) _operation.leftExpression().accept(*this); _operation.rightExpression().accept(*this); + solAssert(*_operation.annotation().userDefinedFunction); m_currentNode->functionDefinition = *_operation.annotation().userDefinedFunction; auto nextNode = newLabel(); @@ -102,13 +103,15 @@ bool ControlFlowBuilder::visit(UnaryOperation const& _operation) if (_operation.annotation().userDefinedFunction.set()) { visitNode(_operation); + _operation.subExpression().accept(*this); + solAssert(*_operation.annotation().userDefinedFunction); m_currentNode->functionDefinition = *_operation.annotation().userDefinedFunction; auto nextNode = newLabel(); connect(m_currentNode, nextNode); m_currentNode = nextNode; - return true; + return false; } return ASTConstVisitor::visit(_operation); diff --git a/libsolidity/analysis/ControlFlowGraph.cpp b/libsolidity/analysis/ControlFlowGraph.cpp index 3dcfef90b..ca36b421c 100644 --- a/libsolidity/analysis/ControlFlowGraph.cpp +++ b/libsolidity/analysis/ControlFlowGraph.cpp @@ -19,15 +19,11 @@ #include #include -#include using namespace std; -using namespace solidity::util; using namespace solidity::langutil; using namespace solidity::frontend; - - bool CFG::constructFlow(ASTNode const& _astRoot) { _astRoot.accept(*this); diff --git a/libsolidity/analysis/ControlFlowGraph.h b/libsolidity/analysis/ControlFlowGraph.h index 64da66028..4ded67268 100644 --- a/libsolidity/analysis/ControlFlowGraph.h +++ b/libsolidity/analysis/ControlFlowGraph.h @@ -98,8 +98,8 @@ struct CFGNode std::vector entries; /// Exit nodes. All CFG nodes to which control flow may continue after this node. std::vector exits; - /// Function call done by this node - FunctionDefinition const* functionDefinition; + /// Resolved definition of the function called by this node + FunctionDefinition const* functionDefinition = nullptr; /// Variable occurrences in the node. std::vector variableOccurrences; // Source location of this control flow block. diff --git a/libsolidity/analysis/FunctionCallGraph.cpp b/libsolidity/analysis/FunctionCallGraph.cpp index 502bd0221..e27a5aa48 100644 --- a/libsolidity/analysis/FunctionCallGraph.cpp +++ b/libsolidity/analysis/FunctionCallGraph.cpp @@ -207,14 +207,20 @@ bool FunctionCallGraphBuilder::visit(MemberAccess const& _memberAccess) bool FunctionCallGraphBuilder::visit(BinaryOperation const& _binaryOperation) { if (_binaryOperation.annotation().userDefinedFunction.set()) + { + solAssert(*_binaryOperation.annotation().userDefinedFunction); functionReferenced(**_binaryOperation.annotation().userDefinedFunction, true /* called directly */); + } return true; } bool FunctionCallGraphBuilder::visit(UnaryOperation const& _unaryOperation) { if (_unaryOperation.annotation().userDefinedFunction.set()) + { + solAssert(*_unaryOperation.annotation().userDefinedFunction); functionReferenced(**_unaryOperation.annotation().userDefinedFunction, true /* called directly */); + } return true; }