Merge pull request #13884 from ethereum/deprecation-warning-for-selfdestruct

Issue warning when using deprecated SELFDESTRUCT
This commit is contained in:
Nikola Matić 2023-01-26 14:33:26 +01:00 committed by GitHub
commit 019d13d3b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 48 additions and 4 deletions

View File

@ -21,6 +21,7 @@ Compiler Features:
* SMTChecker: Make ``z3`` the default solver for the BMC and CHC engines instead of all solvers. * SMTChecker: Make ``z3`` the default solver for the BMC and CHC engines instead of all solvers.
* Parser: More detailed error messages about invalid version pragmas. * Parser: More detailed error messages about invalid version pragmas.
* Removed support for the ``solidity-upgrade`` tool. * Removed support for the ``solidity-upgrade`` tool.
* TypeChecker: Warn when using deprecated builtin ``selfdestruct``.
Bugfixes: Bugfixes:

View File

@ -19,6 +19,7 @@ if they are marked ``virtual``. For details, please see
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0; pragma solidity >=0.7.1 <0.9.0;
// This will report a warning due to deprecated selfdestruct
contract owned { contract owned {
constructor() { owner = payable(msg.sender); } constructor() { owner = payable(msg.sender); }

View File

@ -40,7 +40,7 @@ Details are given in the following example.
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0; pragma solidity >=0.7.0 <0.9.0;
// This will report a warning due to deprecated selfdestruct
contract Owned { contract Owned {
constructor() { owner = payable(msg.sender); } constructor() { owner = payable(msg.sender); }
@ -130,6 +130,7 @@ seen in the following example:
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0; pragma solidity >=0.7.0 <0.9.0;
// This will report a warning due to deprecated selfdestruct
contract owned { contract owned {
constructor() { owner = payable(msg.sender); } constructor() { owner = payable(msg.sender); }
@ -162,6 +163,7 @@ explicitly in the final override, but this function will bypass
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0; pragma solidity >=0.7.0 <0.9.0;
// This will report a warning due to deprecated selfdestruct
contract owned { contract owned {
constructor() { owner = payable(msg.sender); } constructor() { owner = payable(msg.sender); }

View File

@ -144,6 +144,7 @@ The full contract
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0; pragma solidity >=0.7.0 <0.9.0;
// This will report a warning due to deprecated selfdestruct
contract ReceiverPays { contract ReceiverPays {
address owner = msg.sender; address owner = msg.sender;
@ -341,6 +342,7 @@ The full contract
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0; pragma solidity >=0.7.0 <0.9.0;
// This will report a warning due to deprecated selfdestruct
contract SimplePaymentChannel { contract SimplePaymentChannel {
address payable public sender; // The account sending payments. address payable public sender; // The account sending payments.
address payable public recipient; // The account receiving the payments. address payable public recipient; // The account receiving the payments.

View File

@ -562,6 +562,11 @@ is removed from the state. Removing the contract in theory sounds like a good
idea, but it is potentially dangerous, as if someone sends Ether to removed idea, but it is potentially dangerous, as if someone sends Ether to removed
contracts, the Ether is forever lost. contracts, the Ether is forever lost.
.. warning::
From version 0.8.18 and up, the use of ``selfdestruct`` in both Solidity and Yul will trigger a
deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behaviour
as stated in `EIP-6049 <https://eips.ethereum.org/EIPS/eip-6049>`_.
.. warning:: .. warning::
Even if a contract is removed by ``selfdestruct``, it is still part of the Even if a contract is removed by ``selfdestruct``, it is still part of the
history of the blockchain and probably retained by most Ethereum nodes. history of the blockchain and probably retained by most Ethereum nodes.

View File

@ -327,11 +327,13 @@ Contract Related
- the receiving contract's receive function is not executed. - the receiving contract's receive function is not executed.
- the contract is only really destroyed at the end of the transaction and ``revert`` s might "undo" the destruction. - the contract is only really destroyed at the end of the transaction and ``revert`` s might "undo" the destruction.
Furthermore, all functions of the current contract are callable directly including the current function. Furthermore, all functions of the current contract are callable directly including the current function.
.. warning::
From version 0.8.18 and up, the use of ``selfdestruct`` in both Solidity and Yul will trigger a
deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behaviour
as stated in `EIP-6049 <https://eips.ethereum.org/EIPS/eip-6049>`_.
.. note:: .. note::
Prior to version 0.5.0, there was a function called ``suicide`` with the same Prior to version 0.5.0, there was a function called ``suicide`` with the same
semantics as ``selfdestruct``. semantics as ``selfdestruct``.

View File

@ -899,6 +899,7 @@ the ``dup`` and ``swap`` instructions as well as ``jump`` instructions, labels a
| revert(p, s) | `-` | B | end execution, revert state changes, return data mem[p...(p+s)) | | revert(p, s) | `-` | B | end execution, revert state changes, return data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+ +-------------------------+-----+---+-----------------------------------------------------------------+
| selfdestruct(a) | `-` | F | end execution, destroy current contract and send funds to a | | selfdestruct(a) | `-` | F | end execution, destroy current contract and send funds to a |
| | | | (deprecated) |
+-------------------------+-----+---+-----------------------------------------------------------------+ +-------------------------+-----+---+-----------------------------------------------------------------+
| invalid() | `-` | F | end execution with invalid instruction | | invalid() | `-` | F | end execution with invalid instruction |
+-------------------------+-----+---+-----------------------------------------------------------------+ +-------------------------+-----+---+-----------------------------------------------------------------+
@ -956,6 +957,11 @@ the ``dup`` and ``swap`` instructions as well as ``jump`` instructions, labels a
Please note that irrelevant to which EVM version is selected in the compiler, the semantics of Please note that irrelevant to which EVM version is selected in the compiler, the semantics of
instructions depend on the final chain of deployment. instructions depend on the final chain of deployment.
.. warning::
From version 0.8.18 and up, the use of ``selfdestruct`` in both Solidity and Yul will trigger a
deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behaviour
as stated in `EIP-6049 <https://eips.ethereum.org/EIPS/eip-6049>`_.
In some internal dialects, there are additional functions: In some internal dialects, there are additional functions:
datasize, dataoffset, datacopy datasize, dataoffset, datacopy

View File

@ -3657,6 +3657,14 @@ bool TypeChecker::visit(Identifier const& _identifier)
_identifier.location(), _identifier.location(),
"\"suicide\" has been deprecated in favour of \"selfdestruct\"." "\"suicide\" has been deprecated in favour of \"selfdestruct\"."
); );
else if (_identifier.name() == "selfdestruct" && fType->kind() == FunctionType::Kind::Selfdestruct)
m_errorReporter.warning(
5159_error,
_identifier.location(),
"\"selfdestruct\" has been deprecated. "
"The underlying opcode will eventually undergo breaking changes, "
"and its use is not recommended."
);
} }
if ( if (

View File

@ -311,6 +311,14 @@ vector<YulString> AsmAnalyzer::operator()(FunctionCall const& _funCall)
if (BuiltinFunction const* f = m_dialect.builtin(_funCall.functionName.name)) if (BuiltinFunction const* f = m_dialect.builtin(_funCall.functionName.name))
{ {
if (_funCall.functionName.name == "selfdestruct"_yulstring)
m_errorReporter.warning(
1699_error,
nativeLocationOf(_funCall.functionName),
"\"selfdestruct\" has been deprecated. "
"The underlying opcode will eventually undergo breaking changes, "
"and its use is not recommended."
);
parameterTypes = &f->parameters; parameterTypes = &f->parameters;
returnTypes = &f->returns; returnTypes = &f->returns;
if (!f->literalArguments.empty()) if (!f->literalArguments.empty())

View File

@ -2,4 +2,5 @@ contract C {
function f() pure public { selfdestruct; } function f() pure public { selfdestruct; }
} }
// ---- // ----
// Warning 5159: (44-56): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.
// Warning 6133: (44-56): Statement has no effect. // Warning 6133: (44-56): Statement has no effect.

View File

@ -4,4 +4,5 @@ contract C {
} }
} }
// ---- // ----
// Warning 5159: (56-68): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.
// TypeError 9553: (69-70): Invalid type for argument in function call. Invalid implicit conversion from address to address payable requested. // TypeError 9553: (69-70): Invalid type for argument in function call. Invalid implicit conversion from address to address payable requested.

View File

@ -4,3 +4,4 @@ contract C {
} }
} }
// ---- // ----
// Warning 5159: (64-76): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.

View File

@ -19,3 +19,4 @@ contract C {
receive() payable external {} receive() payable external {}
} }
// ---- // ----
// Warning 5159: (122-134): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.

View File

@ -20,6 +20,7 @@ contract C {
} }
} }
// ---- // ----
// Warning 5159: (201-213): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.
// TypeError 8961: (52-77): Function cannot be declared as view because this expression (potentially) modifies the state. // TypeError 8961: (52-77): Function cannot be declared as view because this expression (potentially) modifies the state.
// TypeError 8961: (132-153): Function cannot be declared as view because this expression (potentially) modifies the state. // TypeError 8961: (132-153): Function cannot be declared as view because this expression (potentially) modifies the state.
// TypeError 8961: (201-228): Function cannot be declared as view because this expression (potentially) modifies the state. // TypeError 8961: (201-228): Function cannot be declared as view because this expression (potentially) modifies the state.

View File

@ -85,6 +85,7 @@ contract C {
// ==== // ====
// EVMVersion: >=paris // EVMVersion: >=paris
// ---- // ----
// Warning 1699: (1754-1766): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.
// Warning 5740: (89-1716): Unreachable code. // Warning 5740: (89-1716): Unreachable code.
// Warning 5740: (1729-1741): Unreachable code. // Warning 5740: (1729-1741): Unreachable code.
// Warning 5740: (1754-1769): Unreachable code. // Warning 5740: (1754-1769): Unreachable code.

View File

@ -35,6 +35,7 @@ contract C {
} }
} }
// ---- // ----
// Warning 1699: (498-510): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.
// Warning 5740: (526-853): Unreachable code. // Warning 5740: (526-853): Unreachable code.
// TypeError 2527: (79-87): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view". // TypeError 2527: (79-87): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 8961: (101-113): Function cannot be declared as pure because this expression (potentially) modifies the state. // TypeError 8961: (101-113): Function cannot be declared as pure because this expression (potentially) modifies the state.

View File

@ -23,6 +23,7 @@ contract C {
// ==== // ====
// EVMVersion: >=london // EVMVersion: >=london
// ---- // ----
// Warning 1699: (308-320): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.
// Warning 5740: (336-468): Unreachable code. // Warning 5740: (336-468): Unreachable code.
// TypeError 8961: (75-87): Function cannot be declared as view because this expression (potentially) modifies the state. // TypeError 8961: (75-87): Function cannot be declared as view because this expression (potentially) modifies the state.
// TypeError 8961: (104-119): Function cannot be declared as view because this expression (potentially) modifies the state. // TypeError 8961: (104-119): Function cannot be declared as view because this expression (potentially) modifies the state.

View File

@ -2,3 +2,4 @@
selfdestruct(0x02) selfdestruct(0x02)
} }
// ---- // ----
// Warning 1699: (3-15): "selfdestruct" has been deprecated. The underlying opcode will eventually undergo breaking changes, and its use is not recommended.