mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2452 from ethereum/fixPassingEmptyString
Fix passing empty string
This commit is contained in:
commit
79ed529b3f
@ -16,6 +16,7 @@ Bugfixes:
|
||||
* Type Checker: Make UTF8-validation a bit more sloppy to include more valid sequences.
|
||||
* Fixed crash concerning non-callable types.
|
||||
* Unused variable warnings no longer issued for variables used inside inline assembly.
|
||||
* Code Generator: Fix ABI encoding of empty literal string.
|
||||
* Inline Assembly: Enforce function arguments when parsing functional instructions.
|
||||
* Fixed segfault with constant function parameters
|
||||
|
||||
|
@ -1,4 +1,11 @@
|
||||
[
|
||||
{
|
||||
"name": "SkipEmptyStringLiteral",
|
||||
"summary": "If \"\" is used in a function call, the following function arguments will not be correctly passed to the function.",
|
||||
"description": "If the empty string literal \"\" is used as an argument in a function call, it is skipped by the encoder. This has the effect that the encoding of all arguments following this is shifted left by 32 bytes and thus the function call data is corrupted.",
|
||||
"fixed": "0.4.12",
|
||||
"severity": "low"
|
||||
},
|
||||
{
|
||||
"name": "ConstantOptimizerSubtraction",
|
||||
"summary": "In some situations, the optimizer replaces certain numbers in the code with routines that compute different numbers.",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"0.1.0": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStaleKnowledgeAboutSHA3",
|
||||
@ -15,6 +16,7 @@
|
||||
},
|
||||
"0.1.1": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStaleKnowledgeAboutSHA3",
|
||||
@ -29,6 +31,7 @@
|
||||
},
|
||||
"0.1.2": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStaleKnowledgeAboutSHA3",
|
||||
@ -43,6 +46,7 @@
|
||||
},
|
||||
"0.1.3": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStaleKnowledgeAboutSHA3",
|
||||
@ -57,6 +61,7 @@
|
||||
},
|
||||
"0.1.4": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStaleKnowledgeAboutSHA3",
|
||||
@ -71,6 +76,7 @@
|
||||
},
|
||||
"0.1.5": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStaleKnowledgeAboutSHA3",
|
||||
@ -85,6 +91,7 @@
|
||||
},
|
||||
"0.1.6": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -100,6 +107,7 @@
|
||||
},
|
||||
"0.1.7": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -115,6 +123,7 @@
|
||||
},
|
||||
"0.2.0": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -130,6 +139,7 @@
|
||||
},
|
||||
"0.2.1": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -145,6 +155,7 @@
|
||||
},
|
||||
"0.2.2": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -160,6 +171,7 @@
|
||||
},
|
||||
"0.3.0": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -174,6 +186,7 @@
|
||||
},
|
||||
"0.3.1": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -187,6 +200,7 @@
|
||||
},
|
||||
"0.3.2": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -200,6 +214,7 @@
|
||||
},
|
||||
"0.3.3": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -212,6 +227,7 @@
|
||||
},
|
||||
"0.3.4": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -224,6 +240,7 @@
|
||||
},
|
||||
"0.3.5": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -236,6 +253,7 @@
|
||||
},
|
||||
"0.3.6": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -246,6 +264,7 @@
|
||||
},
|
||||
"0.4.0": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -256,6 +275,7 @@
|
||||
},
|
||||
"0.4.1": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -266,16 +286,20 @@
|
||||
},
|
||||
"0.4.10": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction"
|
||||
],
|
||||
"released": "2017-03-15"
|
||||
},
|
||||
"0.4.11": {
|
||||
"bugs": [],
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral"
|
||||
],
|
||||
"released": "2017-05-03"
|
||||
},
|
||||
"0.4.2": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage",
|
||||
@ -285,6 +309,7 @@
|
||||
},
|
||||
"0.4.3": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"HighOrderByteCleanStorage"
|
||||
@ -293,6 +318,7 @@
|
||||
},
|
||||
"0.4.4": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored"
|
||||
],
|
||||
@ -300,6 +326,7 @@
|
||||
},
|
||||
"0.4.5": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored",
|
||||
"OptimizerStateKnowledgeNotResetForJumpdest"
|
||||
@ -308,6 +335,7 @@
|
||||
},
|
||||
"0.4.6": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction",
|
||||
"IdentityPrecompileReturnIgnored"
|
||||
],
|
||||
@ -315,18 +343,21 @@
|
||||
},
|
||||
"0.4.7": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction"
|
||||
],
|
||||
"released": "2016-12-15"
|
||||
},
|
||||
"0.4.8": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction"
|
||||
],
|
||||
"released": "2017-01-13"
|
||||
},
|
||||
"0.4.9": {
|
||||
"bugs": [
|
||||
"SkipEmptyStringLiteral",
|
||||
"ConstantOptimizerSubtraction"
|
||||
],
|
||||
"released": "2017-01-31"
|
||||
|
@ -128,7 +128,7 @@ void CompilerUtils::storeInMemoryDynamic(Type const& _type, bool _padToWordBound
|
||||
m_context << Instruction::DUP1;
|
||||
storeStringData(bytesConstRef(str->value()));
|
||||
if (_padToWordBoundaries)
|
||||
m_context << u256(((str->value().size() + 31) / 32) * 32);
|
||||
m_context << u256(max<size_t>(32, ((str->value().size() + 31) / 32) * 32));
|
||||
else
|
||||
m_context << u256(str->value().size());
|
||||
m_context << Instruction::ADD;
|
||||
|
@ -9469,6 +9469,29 @@ BOOST_AUTO_TEST_CASE(revert)
|
||||
BOOST_CHECK(callContractFunction("a()") == encodeArgs(u256(42)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(literal_empty_string)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
bytes32 public x;
|
||||
uint public a;
|
||||
function f(bytes32 _x, uint _a) {
|
||||
x = _x;
|
||||
a = _a;
|
||||
}
|
||||
function g() {
|
||||
this.f("", 2);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "C");
|
||||
BOOST_CHECK(callContractFunction("x()") == encodeArgs(u256(0)));
|
||||
BOOST_CHECK(callContractFunction("a()") == encodeArgs(u256(0)));
|
||||
BOOST_CHECK(callContractFunction("g()") == encodeArgs());
|
||||
BOOST_CHECK(callContractFunction("x()") == encodeArgs(u256(0)));
|
||||
BOOST_CHECK(callContractFunction("a()") == encodeArgs(u256(2)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(scientific_notation)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
|
Loading…
Reference in New Issue
Block a user