From 275a43068c85df8b7498da691f57c559c482bb3b Mon Sep 17 00:00:00 2001 From: wechman Date: Tue, 12 Jul 2022 12:00:23 +0200 Subject: [PATCH] Update ViewPureChecker --- libsolidity/analysis/ViewPureChecker.cpp | 29 +++++++++++++++++++----- libsolidity/analysis/ViewPureChecker.h | 4 ++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/libsolidity/analysis/ViewPureChecker.cpp b/libsolidity/analysis/ViewPureChecker.cpp index 2086d6f00..a7f18f298 100644 --- a/libsolidity/analysis/ViewPureChecker.cpp +++ b/libsolidity/analysis/ViewPureChecker.cpp @@ -323,18 +323,35 @@ ViewPureChecker::MutabilityAndLocation const& ViewPureChecker::modifierMutabilit return m_inferredMutability.at(&_modifier); } -// TODO needs to visit binaryoperation as well +void ViewPureChecker::reportFunctionCallMutability(StateMutability _mutability, langutil::SourceLocation const& _location) +{ + // We only require "nonpayable" to call a payable function. + if (_mutability == StateMutability::Payable) + _mutability = StateMutability::NonPayable; + reportMutability(_mutability, _location); +} + +void ViewPureChecker::endVisit(BinaryOperation const& _binaryOperation) +{ + if (_binaryOperation.annotation().userDefinedFunction) + reportFunctionCallMutability(_binaryOperation.annotation().userDefinedFunction->stateMutability(), _binaryOperation.location()); +} + +void ViewPureChecker::endVisit(UnaryOperation const& _unaryOperation) +{ + if (_unaryOperation.annotation().userDefinedFunction) + reportFunctionCallMutability(_unaryOperation.annotation().userDefinedFunction->stateMutability(), _unaryOperation.location()); +} void ViewPureChecker::endVisit(FunctionCall const& _functionCall) { if (*_functionCall.annotation().kind != FunctionCallKind::FunctionCall) return; - StateMutability mutability = dynamic_cast(*_functionCall.expression().annotation().type).stateMutability(); - // We only require "nonpayable" to call a payble function. - if (mutability == StateMutability::Payable) - mutability = StateMutability::NonPayable; - reportMutability(mutability, _functionCall.location()); + reportFunctionCallMutability( + dynamic_cast(*_functionCall.expression().annotation().type).stateMutability(), + _functionCall.location() + ); } bool ViewPureChecker::visit(MemberAccess const& _memberAccess) diff --git a/libsolidity/analysis/ViewPureChecker.h b/libsolidity/analysis/ViewPureChecker.h index b0abe8fd8..0dcfb16d9 100644 --- a/libsolidity/analysis/ViewPureChecker.h +++ b/libsolidity/analysis/ViewPureChecker.h @@ -54,6 +54,8 @@ private: bool visit(FunctionDefinition const& _funDef) override; void endVisit(FunctionDefinition const& _funDef) override; + void endVisit(BinaryOperation const& _binaryOperation) override; + void endVisit(UnaryOperation const& _unaryOperation) override; bool visit(ModifierDefinition const& _modifierDef) override; void endVisit(ModifierDefinition const& _modifierDef) override; void endVisit(Identifier const& _identifier) override; @@ -73,6 +75,8 @@ private: std::optional const& _nestedLocation = {} ); + void reportFunctionCallMutability(StateMutability _mutability, langutil::SourceLocation const& _location); + /// Determines the mutability of modifier if not already cached. MutabilityAndLocation const& modifierMutability(ModifierDefinition const& _modifier);