diff options
-rw-r--r-- | docs/miscellaneous.rst | 3 | ||||
-rw-r--r-- | libsolidity/codegen/CompilerUtils.cpp | 4 | ||||
-rw-r--r-- | test/libsolidity/Assembly.cpp | 2 |
3 files changed, 6 insertions, 3 deletions
diff --git a/docs/miscellaneous.rst b/docs/miscellaneous.rst index 7e9cee44..251d77d2 100644 --- a/docs/miscellaneous.rst +++ b/docs/miscellaneous.rst @@ -111,6 +111,9 @@ value is considered ``true`` by ``JUMPI`` instruction, we do not clean the boolean values before they are used as the condition for ``JUMPI``. +In addition to the design principle above, the Solidity compiler +cleans input data when it is loaded onto the stack. + Different types have different rules for cleaning up overflows: +---------------+---------------+------------------+ diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index ce5bb1d2..6763e995 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -925,8 +925,8 @@ unsigned CompilerUtils::loadFromMemoryHelper(Type const& _type, bool _fromCallda if (leftAligned) m_context << shiftFactor << Instruction::MUL; } - if (_fromCalldata && _type.category() == Type::Category::Bool) - m_context << Instruction::ISZERO << Instruction::ISZERO; + if (_fromCalldata) + convertType(_type, _type, true); return numBytes; } diff --git a/test/libsolidity/Assembly.cpp b/test/libsolidity/Assembly.cpp index cc77bd4c..ed92ca2b 100644 --- a/test/libsolidity/Assembly.cpp +++ b/test/libsolidity/Assembly.cpp @@ -116,7 +116,7 @@ BOOST_AUTO_TEST_CASE(location_test) shared_ptr<string const> n = make_shared<string>(""); AssemblyItems items = compileContract(sourceCode); vector<SourceLocation> locations = - vector<SourceLocation>(16, SourceLocation(2, 75, n)) + + vector<SourceLocation>(18, SourceLocation(2, 75, n)) + vector<SourceLocation>(27, SourceLocation(20, 72, n)) + vector<SourceLocation>{SourceLocation(42, 51, n), SourceLocation(65, 67, n)} + vector<SourceLocation>(2, SourceLocation(58, 67, n)) + |