Merge pull request #3521 from ethereum/uninitializedStoragePointers

Disallow uninitialized storage pointers as experimental 0.5.0 feature.
This commit is contained in:
Alex Beregszaszi 2018-02-15 12:05:21 +00:00 committed by GitHub
commit 5746e2d7d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 1 deletions

View File

@ -1,6 +1,7 @@
### 0.4.21 (unreleased)
Features:
* Type Checker: Disallow uninitialized storage pointers as experimental 0.5.0 feature.
Bugfixes:

View File

@ -972,7 +972,11 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
string errorText{"Uninitialized storage pointer."};
if (varDecl.referenceLocation() == VariableDeclaration::Location::Default)
errorText += " Did you mean '<type> memory " + varDecl.name() + "'?";
m_errorReporter.warning(varDecl.location(), errorText);
solAssert(m_scope, "");
if (m_scope->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050))
m_errorReporter.declarationError(varDecl.location(), errorText);
else
m_errorReporter.warning(varDecl.location(), errorText);
}
}
else if (dynamic_cast<MappingType const*>(type(varDecl).get()))

View File

@ -3021,6 +3021,20 @@ BOOST_AUTO_TEST_CASE(uninitialized_mapping_array_variable)
CHECK_WARNING(sourceCode, "Uninitialized storage pointer");
}
BOOST_AUTO_TEST_CASE(uninitialized_mapping_array_variable_050)
{
char const* sourceCode = R"(
pragma experimental "v0.5.0";
contract C {
function f() pure public {
mapping(uint => uint)[] storage x;
x;
}
}
)";
CHECK_ERROR(sourceCode, DeclarationError, "Uninitialized storage pointer");
}
BOOST_AUTO_TEST_CASE(no_delete_on_storage_pointers)
{
char const* sourceCode = R"(
@ -3320,6 +3334,24 @@ BOOST_AUTO_TEST_CASE(non_initialized_references)
CHECK_WARNING(text, "Uninitialized storage pointer");
}
BOOST_AUTO_TEST_CASE(non_initialized_references_050)
{
char const* text = R"(
pragma experimental "v0.5.0";
contract c
{
struct s {
uint a;
}
function f() public {
s storage x;
}
}
)";
CHECK_ERROR(text, DeclarationError, "Uninitialized storage pointer");
}
BOOST_AUTO_TEST_CASE(keccak256_with_large_integer_constant)
{
char const* text = R"(