From 044058276ea27b3d43622b28416ad4dc41091a31 Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 30 Jun 2017 16:37:08 +0200 Subject: [PATCH] Warn about callcode. --- Changelog.md | 1 + libsolidity/analysis/StaticAnalyzer.cpp | 8 ++++++ .../SolidityNameAndTypeResolution.cpp | 27 ++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 8b44934d1..4f224d5b1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -16,6 +16,7 @@ Features: * Code Generator: Added the Whiskers template system. * Remove obsolete Why3 output. * Type Checker: Enforce strict UTF-8 validation. + * Static Analyzer: Warn about deprecation of ``callcode``. Bugfixes: * Code generator: Use ``REVERT`` instead of ``INVALID`` for generated input validation routines. diff --git a/libsolidity/analysis/StaticAnalyzer.cpp b/libsolidity/analysis/StaticAnalyzer.cpp index 375e9bdea..b1b31163f 100644 --- a/libsolidity/analysis/StaticAnalyzer.cpp +++ b/libsolidity/analysis/StaticAnalyzer.cpp @@ -123,6 +123,14 @@ bool StaticAnalyzer::visit(MemberAccess const& _memberAccess) "\"msg.value\" used in non-payable function. Do you want to add the \"payable\" modifier to this function?" ); + if (_memberAccess.memberName() == "callcode") + if (auto const* type = dynamic_cast(_memberAccess.annotation().type.get())) + if (type->kind() == FunctionType::Kind::BareCallCode) + m_errorReporter.warning( + _memberAccess.location(), + "\"callcode\" has been deprecated in favour of \"delegatecall\"." + ); + return true; } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 169b33d15..d0aee3d0c 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -4679,7 +4679,7 @@ BOOST_AUTO_TEST_CASE(unused_return_value_callcode) } } )"; - CHECK_WARNING(text, "Return value of low-level calls not used"); + CHECK_WARNING_ALLOW_MULTI(text, "Return value of low-level calls not used"); } BOOST_AUTO_TEST_CASE(unused_return_value_delegatecall) @@ -4694,6 +4694,31 @@ BOOST_AUTO_TEST_CASE(unused_return_value_delegatecall) CHECK_WARNING(text, "Return value of low-level calls not used"); } +BOOST_AUTO_TEST_CASE(warn_about_callcode) +{ + char const* text = R"( + contract test { + function f() { + var x = address(0x12).callcode; + x; + } + } + )"; + CHECK_WARNING(text, "\"callcode\" has been deprecated in favour"); +} + +BOOST_AUTO_TEST_CASE(no_warn_about_callcode_as_local) +{ + char const* text = R"( + contract test { + function callcode() { + var x = this.callcode; + } + } + )"; + CHECK_SUCCESS_NO_WARNINGS(text); +} + BOOST_AUTO_TEST_CASE(modifier_without_underscore) { char const* text = R"(