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

todo: check for dynamicaly sized arrays

Conflicts:
	test/libsolidity/SolidityEndToEndTest.cpp
This commit is contained in:
LianaHus 2015-09-15 11:40:14 +02:00
parent b7b16b153b
commit e21632555c

View File

@ -1037,12 +1037,9 @@ BOOST_AUTO_TEST_CASE(array_accessor)
)";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("data(uint256)", 0) == encodeArgs(8));
BOOST_CHECK(callContractFunction("data(uint256)", 8) == encodeArgs());
BOOST_CHECK(callContractFunction("dynamicData(uint256)", 2) == encodeArgs(8));
BOOST_CHECK(callContractFunction("dynamicData(uint256)", 8) == encodeArgs());
BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 1) == encodeArgs(22));
BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 127) == encodeArgs(2));
BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 128) == encodeArgs());
BOOST_CHECK(callContractFunction("multiple_map(uint256,uint256,uint256)", 2, 1, 2) == encodeArgs(3));
}
@ -1061,9 +1058,7 @@ BOOST_AUTO_TEST_CASE(accessors_mapping_for_array)
)";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("data(uint256,uint256)", 2, 2) == encodeArgs(8));
BOOST_CHECK(callContractFunction("data(uint256, 256)", 2, 8) == encodeArgs());
BOOST_CHECK(callContractFunction("dynamicData(uint256,uint256)", 2, 2) == encodeArgs(8));
BOOST_CHECK(callContractFunction("dynamicData(uint256,uint256)", 2, 8) == encodeArgs());
}
BOOST_AUTO_TEST_CASE(multiple_elementary_accessors)
@ -1248,6 +1243,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_fixed_bytes_same_size)
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("bytesToBytes(bytes4)", "abcd") == encodeArgs("abcd"));
}
// fixed bytes to uint conversion tests
BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_same_size)
{
@ -1300,6 +1296,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_greater_size)
BOOST_CHECK(callContractFunction("bytesToUint(bytes4)", string("abcd")) ==
encodeArgs(u256("0x61626364")));
}
// uint fixed bytes conversion tests
BOOST_AUTO_TEST_CASE(convert_uint_to_fixed_bytes_same_size)
{
@ -4180,21 +4177,21 @@ BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_call_fail)
BOOST_CHECK(callContractFunction("test()") == encodeArgs(2));
}
BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund)
{
char const* sourceCode = R"(
contract A {
uint public test = 1;
uint[3] arr;
function A()
{
test = arr[5];
++test;
}
}
)";
BOOST_CHECK(compileAndRunWithoutCheck(sourceCode, 0, "A").empty());
}
//BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund)
//{
// char const* sourceCode = R"(
// contract A {
// uint public test = 1;
// uint[3] arr;
// function A()
// {
// test = arr[5];
// ++test;
// }
// }
// )";
// BOOST_CHECK(compileAndRunWithoutCheck(sourceCode, 0, "A").empty());
//}
BOOST_AUTO_TEST_CASE(positive_integers_to_signed)
{
@ -5266,19 +5263,48 @@ BOOST_AUTO_TEST_CASE(array_out_of_bound_access)
{
char const* sourceCode = R"(
contract c {
uint[4] data;
function set(uint index) returns (bool) {
data[index] = 2;
uint[2] dataArray;
function set5th() returns (bool) {
dataArray[5] = 2;
return true;
}
}
)";
// compileAndRun(sourceCode, 0, "Test");
// BOOST_CHECK(callContractFunction("set()", u256(7)) == encodeArgs(false));
// BOOST_CHECK(callContractFunction("set()", u256(3)) == encodeArgs(true));
compileRequireThrow<CompilerError>(sourceCode);
}
//BOOST_AUTO_TEST_CASE(dynamic_array_out_of_bound_access)
//{
// char const* sourceCode = R"(
// contract c {
// uint[] dataArrayDynamic;
// function set5th() returns (bool) {
// dataArrayDynamic.length = 2;
// dataArrayDynamic[5] = 3;
// return true;
// }
// }
// )";
// compileRequireThrow<CompilerError>(sourceCode);
//}
//BOOST_AUTO_TEST_CASE(bytes_out_of_bound_access)
//{
// char const* sourceCode = R"(
// contract c {
// bytes data;
// function write() returns (uint) {
// data.length = 3;
// data[1] = 0x77;
// data[2] = 0x14;
// data[8] = 3;
// }
// }
// )";
// compileRequireThrow<CompilerError>(sourceCode);
//}
BOOST_AUTO_TEST_SUITE_END()
}