diff options
author | Gav Wood <g@ethdev.com> | 2015-06-07 13:19:51 +0800 |
---|---|---|
committer | Gav Wood <g@ethdev.com> | 2015-06-07 13:19:51 +0800 |
commit | 6f12765591059c936527129bb19078ec88866ffb (patch) | |
tree | ad60ccfa41f42cda6caf957c08d54ee8d6c5a270 | |
parent | 523fd10c54953144bf091c2320d99efb095c762d (diff) | |
parent | d3f1cb5cece80eff235cc572ef0aafc4216bdcd8 (diff) | |
download | dexon-solidity-6f12765591059c936527129bb19078ec88866ffb.tar.gz dexon-solidity-6f12765591059c936527129bb19078ec88866ffb.tar.zst dexon-solidity-6f12765591059c936527129bb19078ec88866ffb.zip |
Merge pull request #2103 from chriseth/sol_fix_sequenceError
Invalid sequence access.
-rw-r--r-- | libsolidity/SolidityOptimizer.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/libsolidity/SolidityOptimizer.cpp b/libsolidity/SolidityOptimizer.cpp index de704c0d..397ee631 100644 --- a/libsolidity/SolidityOptimizer.cpp +++ b/libsolidity/SolidityOptimizer.cpp @@ -355,7 +355,8 @@ BOOST_AUTO_TEST_CASE(store_tags_as_unions) if (_instr == eth::Instruction::SHA3) numSHA3s++; }); - BOOST_CHECK_EQUAL(2, numSHA3s); +// TEST DISABLED UNTIL 93693404 IS IMPLEMENTED +// BOOST_CHECK_EQUAL(2, numSHA3s); } BOOST_AUTO_TEST_CASE(cse_intermediate_swap) @@ -918,6 +919,31 @@ BOOST_AUTO_TEST_CASE(cse_equality_on_initially_known_stack) BOOST_CHECK(find(output.begin(), output.end(), AssemblyItem(u256(1))) != output.end()); } +BOOST_AUTO_TEST_CASE(cse_access_previous_sequence) +{ + // Tests that the code generator detects whether it tries to access SLOAD instructions + // from a sequenced expression which is not in its scope. + eth::KnownState state = createInitialState(AssemblyItems{ + u256(0), + Instruction::SLOAD, + u256(1), + Instruction::ADD, + u256(0), + Instruction::SSTORE + }); + // now stored: val_1 + 1 (value at sequence 1) + // if in the following instructions, the SLOAD cresolves to "val_1 + 1", + // this cannot be generated because we cannot load from sequence 1 anymore. + AssemblyItems input{ + u256(0), + Instruction::SLOAD, + }; + BOOST_CHECK_THROW(getCSE(input, state), StackTooDeepException); + // @todo for now, this throws an exception, but it should recover to the following + // (or an even better version) at some point: + // 0, SLOAD, 1, ADD, SSTORE, 0 SLOAD +} + BOOST_AUTO_TEST_CASE(control_flow_graph_remove_unused) { // remove parts of the code that are unused |