added compile time check for out of bounds access for ordinary arrays

todo: check for dynamicaly sized arrays

Conflicts:
	libsolidity/ExpressionCompiler.cpp
This commit is contained in:
LianaHus 2015-09-09 17:35:27 +02:00
parent 626a57826c
commit b7b16b153b

View File

@ -821,6 +821,8 @@ bool ExpressionCompiler::visit(IndexAccess const& _indexAccess)
_indexAccess.baseExpression().accept(*this);
Type const& baseType = *_indexAccess.baseExpression().type();
Type const& indexType = *_indexAccess.indexExpression()->type();
if (baseType.category() == Type::Category::Mapping)
{
// stack: storage_base_ref
@ -861,8 +863,20 @@ bool ExpressionCompiler::visit(IndexAccess const& _indexAccess)
solAssert(_indexAccess.indexExpression(), "Index expression expected.");
_indexAccess.indexExpression()->accept(*this);
// check for dynamically sized arrays should be done after memberAccess visit to have length
if (
(indexType.category() == Type::Category::IntegerConstant) &&
((arrayType.isDynamicallySized() && arrayType.length()) || !arrayType.isDynamicallySized()))
{
IntegerConstantType const& constant = dynamic_cast<IntegerConstantType const&>(indexType);
if (arrayType.length() < constant.literalValue(nullptr))
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Out of bounds access."));
}
// stack layout: <base_ref> [<length>] <index>
ArrayUtils(m_context).accessIndex(arrayType);
switch (arrayType.location())
{
case DataLocation::Storage: