Merge pull request #4423 from ethereum/enforce_error_gasleft

[BREAKING] Enforce error on msg.gas and block.blockhash()
This commit is contained in:
chriseth 2018-07-04 13:56:10 +02:00 committed by GitHub
commit 476372243b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 20 additions and 68 deletions

View File

@ -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)

View File

@ -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);
}
}
)";

View File

@ -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());
}

View File

@ -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)

View File

@ -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()"

View File

@ -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()"

View File

@ -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()"

View File

@ -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()"

View File

@ -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.