mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #4423 from ethereum/enforce_error_gasleft
[BREAKING] Enforce error on msg.gas and block.blockhash()
This commit is contained in:
commit
476372243b
@ -150,36 +150,18 @@ bool StaticAnalyzer::visit(ExpressionStatement const& _statement)
|
||||
|
||||
bool StaticAnalyzer::visit(MemberAccess const& _memberAccess)
|
||||
{
|
||||
bool const v050 = m_currentContract->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
|
||||
|
||||
if (MagicType const* type = dynamic_cast<MagicType const*>(_memberAccess.expression().annotation().type.get()))
|
||||
{
|
||||
if (type->kind() == MagicType::Kind::Message && _memberAccess.memberName() == "gas")
|
||||
{
|
||||
if (v050)
|
||||
m_errorReporter.typeError(
|
||||
_memberAccess.location(),
|
||||
"\"msg.gas\" has been deprecated in favor of \"gasleft()\""
|
||||
);
|
||||
else
|
||||
m_errorReporter.warning(
|
||||
_memberAccess.location(),
|
||||
"\"msg.gas\" has been deprecated in favor of \"gasleft()\""
|
||||
);
|
||||
}
|
||||
if (type->kind() == MagicType::Kind::Block && _memberAccess.memberName() == "blockhash")
|
||||
{
|
||||
if (v050)
|
||||
m_errorReporter.typeError(
|
||||
_memberAccess.location(),
|
||||
"\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
|
||||
);
|
||||
else
|
||||
m_errorReporter.warning(
|
||||
_memberAccess.location(),
|
||||
"\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
|
||||
);
|
||||
}
|
||||
m_errorReporter.typeError(
|
||||
_memberAccess.location(),
|
||||
"\"msg.gas\" has been deprecated in favor of \"gasleft()\""
|
||||
);
|
||||
else if (type->kind() == MagicType::Kind::Block && _memberAccess.memberName() == "blockhash")
|
||||
m_errorReporter.typeError(
|
||||
_memberAccess.location(),
|
||||
"\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
|
||||
);
|
||||
}
|
||||
|
||||
if (m_nonPayablePublic && !m_library)
|
||||
|
@ -1856,7 +1856,7 @@ BOOST_AUTO_TEST_CASE(uncalled_blockhash)
|
||||
contract C {
|
||||
function f() public view returns (bytes32)
|
||||
{
|
||||
return (block.blockhash)(block.number - 1);
|
||||
return (blockhash)(block.number - 1);
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
@ -524,31 +524,16 @@ BOOST_AUTO_TEST_CASE(gas_left)
|
||||
char const* sourceCode = R"(
|
||||
contract test {
|
||||
function f() returns (uint256 val) {
|
||||
return msg.gas;
|
||||
return gasleft();
|
||||
}
|
||||
}
|
||||
)";
|
||||
bytes code = compileFirstExpression(
|
||||
sourceCode, {}, {},
|
||||
{make_shared<MagicVariableDeclaration>("msg", make_shared<MagicType>(MagicType::Kind::Message))}
|
||||
);
|
||||
|
||||
bytes expectation({byte(Instruction::GAS)});
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||
|
||||
sourceCode = R"(
|
||||
contract test {
|
||||
function f() returns (uint256 val) {
|
||||
return gasleft();
|
||||
}
|
||||
}
|
||||
)";
|
||||
code = compileFirstExpression(
|
||||
sourceCode, {}, {},
|
||||
{make_shared<MagicVariableDeclaration>("gasleft", make_shared<FunctionType>(strings(), strings{"uint256"}, FunctionType::Kind::GasLeft))}
|
||||
);
|
||||
|
||||
expectation = bytes({byte(Instruction::GAS)});
|
||||
bytes expectation = bytes({byte(Instruction::GAS)});
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||
}
|
||||
|
||||
|
@ -43,13 +43,11 @@ BOOST_AUTO_TEST_CASE(environment_access)
|
||||
vector<string> view{
|
||||
"block.coinbase",
|
||||
"block.timestamp",
|
||||
"block.blockhash(7)",
|
||||
"block.difficulty",
|
||||
"block.number",
|
||||
"block.gaslimit",
|
||||
"blockhash(7)",
|
||||
"gasleft()",
|
||||
"msg.gas",
|
||||
"msg.value",
|
||||
"msg.sender",
|
||||
"tx.origin",
|
||||
@ -90,12 +88,11 @@ BOOST_AUTO_TEST_CASE(environment_access)
|
||||
"Statement has no effect."
|
||||
}));
|
||||
|
||||
CHECK_WARNING_ALLOW_MULTI(
|
||||
CHECK_ERROR(
|
||||
"contract C { function f() view public { block.blockhash; } }",
|
||||
(std::vector<std::string>{
|
||||
"Function state mutability can be restricted to pure",
|
||||
"\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
|
||||
}));
|
||||
TypeError,
|
||||
"\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
|
||||
);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(assembly_staticcall)
|
||||
|
@ -2,4 +2,4 @@ contract C {
|
||||
function f() public view returns (uint256 val) { return msg.gas; }
|
||||
}
|
||||
// ----
|
||||
// Warning: (73-80): "msg.gas" has been deprecated in favor of "gasleft()"
|
||||
// TypeError: (73-80): "msg.gas" has been deprecated in favor of "gasleft()"
|
||||
|
@ -1,6 +0,0 @@
|
||||
pragma experimental "v0.5.0";
|
||||
contract C {
|
||||
function f() public returns (uint256 val) { return msg.gas; }
|
||||
}
|
||||
// ----
|
||||
// TypeError: (98-105): "msg.gas" has been deprecated in favor of "gasleft()"
|
@ -4,4 +4,4 @@ contract C {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// Warning: (77-92): "block.blockhash()" has been deprecated in favor of "blockhash()"
|
||||
// TypeError: (77-92): "block.blockhash()" has been deprecated in favor of "blockhash()"
|
||||
|
@ -1,6 +0,0 @@
|
||||
pragma experimental "v0.5.0";
|
||||
contract C {
|
||||
function f() public returns (bytes32) { return block.blockhash(3); }
|
||||
}
|
||||
// ----
|
||||
// TypeError: (94-109): "block.blockhash()" has been deprecated in favor of "blockhash()"
|
@ -1,6 +1,6 @@
|
||||
contract C {
|
||||
function f() public pure {
|
||||
bytes32 h = keccak256(abi.encodePacked(keccak256, f, this.f.gas, block.blockhash));
|
||||
bytes32 h = keccak256(abi.encodePacked(keccak256, f, this.f.gas, blockhash));
|
||||
h;
|
||||
}
|
||||
}
|
||||
@ -8,4 +8,4 @@ contract C {
|
||||
// TypeError: (91-100): This type cannot be encoded.
|
||||
// TypeError: (102-103): This type cannot be encoded.
|
||||
// TypeError: (105-115): This type cannot be encoded.
|
||||
// TypeError: (117-132): This type cannot be encoded.
|
||||
// TypeError: (117-126): This type cannot be encoded.
|
||||
|
Loading…
Reference in New Issue
Block a user