mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
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:
parent
b7b16b153b
commit
e21632555c
@ -1037,12 +1037,9 @@ BOOST_AUTO_TEST_CASE(array_accessor)
|
|||||||
)";
|
)";
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
BOOST_CHECK(callContractFunction("data(uint256)", 0) == encodeArgs(8));
|
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)", 2) == encodeArgs(8));
|
||||||
BOOST_CHECK(callContractFunction("dynamicData(uint256)", 8) == encodeArgs());
|
|
||||||
BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 1) == encodeArgs(22));
|
BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 1) == encodeArgs(22));
|
||||||
BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 127) == encodeArgs(2));
|
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));
|
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);
|
compileAndRun(sourceCode);
|
||||||
BOOST_CHECK(callContractFunction("data(uint256,uint256)", 2, 2) == encodeArgs(8));
|
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, 2) == encodeArgs(8));
|
||||||
BOOST_CHECK(callContractFunction("dynamicData(uint256,uint256)", 2, 8) == encodeArgs());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(multiple_elementary_accessors)
|
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);
|
compileAndRun(sourceCode);
|
||||||
BOOST_CHECK(callContractFunction("bytesToBytes(bytes4)", "abcd") == encodeArgs("abcd"));
|
BOOST_CHECK(callContractFunction("bytesToBytes(bytes4)", "abcd") == encodeArgs("abcd"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// fixed bytes to uint conversion tests
|
// fixed bytes to uint conversion tests
|
||||||
BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_same_size)
|
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")) ==
|
BOOST_CHECK(callContractFunction("bytesToUint(bytes4)", string("abcd")) ==
|
||||||
encodeArgs(u256("0x61626364")));
|
encodeArgs(u256("0x61626364")));
|
||||||
}
|
}
|
||||||
|
|
||||||
// uint fixed bytes conversion tests
|
// uint fixed bytes conversion tests
|
||||||
BOOST_AUTO_TEST_CASE(convert_uint_to_fixed_bytes_same_size)
|
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_CHECK(callContractFunction("test()") == encodeArgs(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund)
|
//BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund)
|
||||||
{
|
//{
|
||||||
char const* sourceCode = R"(
|
// char const* sourceCode = R"(
|
||||||
contract A {
|
// contract A {
|
||||||
uint public test = 1;
|
// uint public test = 1;
|
||||||
uint[3] arr;
|
// uint[3] arr;
|
||||||
function A()
|
// function A()
|
||||||
{
|
// {
|
||||||
test = arr[5];
|
// test = arr[5];
|
||||||
++test;
|
// ++test;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
)";
|
// )";
|
||||||
BOOST_CHECK(compileAndRunWithoutCheck(sourceCode, 0, "A").empty());
|
// BOOST_CHECK(compileAndRunWithoutCheck(sourceCode, 0, "A").empty());
|
||||||
}
|
//}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(positive_integers_to_signed)
|
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"(
|
char const* sourceCode = R"(
|
||||||
contract c {
|
contract c {
|
||||||
uint[4] data;
|
uint[2] dataArray;
|
||||||
function set(uint index) returns (bool) {
|
function set5th() returns (bool) {
|
||||||
data[index] = 2;
|
dataArray[5] = 2;
|
||||||
return true;
|
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);
|
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()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user