mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Use revert for out-of-bounds array index access in getter.
This commit is contained in:
parent
8fd6de9403
commit
5dc3a971cb
@ -12,6 +12,7 @@ Compiler Features:
|
|||||||
Bugfixes:
|
Bugfixes:
|
||||||
* Code generator: Fix internal compiler error when referencing members via module name but not using the reference.
|
* Code generator: Fix internal compiler error when referencing members via module name but not using the reference.
|
||||||
* Code generator: Fix ``ABIEncoderV2`` pragma from the current module affecting inherited functions and applied modifiers.
|
* Code generator: Fix ``ABIEncoderV2`` pragma from the current module affecting inherited functions and applied modifiers.
|
||||||
|
* Code generator: Use revert instead of invalid opcode for out-of-bounds array index access in getter.
|
||||||
* Type Checker: Fix internal compiler error caused by storage parameters with nested mappings in libraries.
|
* Type Checker: Fix internal compiler error caused by storage parameters with nested mappings in libraries.
|
||||||
* Name Resolver: Fix shadowing/same-name warnings for later declarations.
|
* Name Resolver: Fix shadowing/same-name warnings for later declarations.
|
||||||
* Contract Level Checker: Add missing check against inheriting functions with ABIEncoderV2 return types in ABIEncoderV1 contracts.
|
* Contract Level Checker: Add missing check against inheriting functions with ABIEncoderV2 return types in ABIEncoderV1 contracts.
|
||||||
|
@ -170,7 +170,16 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const&
|
|||||||
// pop offset
|
// pop offset
|
||||||
m_context << Instruction::POP;
|
m_context << Instruction::POP;
|
||||||
utils().copyToStackTop(paramTypes.size() - i + 1, 1);
|
utils().copyToStackTop(paramTypes.size() - i + 1, 1);
|
||||||
ArrayUtils(m_context).accessIndex(*arrayType);
|
|
||||||
|
ArrayUtils(m_context).retrieveLength(*arrayType, 1);
|
||||||
|
// Stack: ref [length] index length
|
||||||
|
// check out-of-bounds access
|
||||||
|
m_context << Instruction::DUP2 << Instruction::LT;
|
||||||
|
auto tag = m_context.appendConditionalJump();
|
||||||
|
m_context << u256(0) << Instruction::DUP1 << Instruction::REVERT;
|
||||||
|
m_context << tag;
|
||||||
|
|
||||||
|
ArrayUtils(m_context).accessIndex(*arrayType, false);
|
||||||
returnType = arrayType->baseType();
|
returnType = arrayType->baseType();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -348,18 +348,25 @@ string IRGenerator::generateGetter(VariableDeclaration const& _varDecl)
|
|||||||
mappingType ? *mappingType->keyType() : *TypeProvider::uint256()
|
mappingType ? *mappingType->keyType() : *TypeProvider::uint256()
|
||||||
).stackSlots();
|
).stackSlots();
|
||||||
parameters += keys;
|
parameters += keys;
|
||||||
code += Whiskers(R"(
|
|
||||||
|
Whiskers templ(R"(
|
||||||
|
<?array>
|
||||||
|
if iszero(lt(<keys>, <length>(slot))) { revert(0, 0) }
|
||||||
|
</array>
|
||||||
slot<?array>, offset</array> := <indexAccess>(slot<?+keys>, <keys></+keys>)
|
slot<?array>, offset</array> := <indexAccess>(slot<?+keys>, <keys></+keys>)
|
||||||
)")
|
)");
|
||||||
(
|
templ(
|
||||||
"indexAccess",
|
"indexAccess",
|
||||||
mappingType ?
|
mappingType ?
|
||||||
m_utils.mappingIndexAccessFunction(*mappingType, *mappingType->keyType()) :
|
m_utils.mappingIndexAccessFunction(*mappingType, *mappingType->keyType()) :
|
||||||
m_utils.storageArrayIndexAccessFunction(*arrayType)
|
m_utils.storageArrayIndexAccessFunction(*arrayType)
|
||||||
)
|
)
|
||||||
("array", arrayType != nullptr)
|
("array", arrayType != nullptr)
|
||||||
("keys", joinHumanReadable(keys))
|
("keys", joinHumanReadable(keys));
|
||||||
.render();
|
if (arrayType)
|
||||||
|
templ("length", m_utils.arrayLengthFunction(*arrayType));
|
||||||
|
|
||||||
|
code += templ.render();
|
||||||
|
|
||||||
currentType = mappingType ? mappingType->valueType() : arrayType->baseType();
|
currentType = mappingType ? mappingType->valueType() : arrayType->baseType();
|
||||||
}
|
}
|
||||||
|
@ -14,9 +14,9 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 1106800
|
// codeDepositCost: 1107400
|
||||||
// executionCost: 1147
|
// executionCost: 1154
|
||||||
// totalCost: 1107947
|
// totalCost: 1108554
|
||||||
// external:
|
// external:
|
||||||
// a(): 1130
|
// a(): 1130
|
||||||
// b(uint256): infinite
|
// b(uint256): infinite
|
||||||
|
@ -17,9 +17,9 @@ contract C {
|
|||||||
// optimize-yul: true
|
// optimize-yul: true
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 604400
|
// codeDepositCost: 605000
|
||||||
// executionCost: 638
|
// executionCost: 638
|
||||||
// totalCost: 605038
|
// totalCost: 605638
|
||||||
// external:
|
// external:
|
||||||
// a(): 1029
|
// a(): 1029
|
||||||
// b(uint256): 2084
|
// b(uint256): 2084
|
||||||
|
@ -24,9 +24,9 @@ contract Large {
|
|||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 637000
|
// codeDepositCost: 637600
|
||||||
// executionCost: 670
|
// executionCost: 670
|
||||||
// totalCost: 637670
|
// totalCost: 638270
|
||||||
// external:
|
// external:
|
||||||
// a(): 1051
|
// a(): 1051
|
||||||
// b(uint256): 2046
|
// b(uint256): 2046
|
||||||
|
@ -27,9 +27,9 @@ contract Large {
|
|||||||
// optimize-runs: 2
|
// optimize-runs: 2
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 260600
|
// codeDepositCost: 261200
|
||||||
// executionCost: 300
|
// executionCost: 300
|
||||||
// totalCost: 260900
|
// totalCost: 261500
|
||||||
// external:
|
// external:
|
||||||
// a(): 998
|
// a(): 998
|
||||||
// b(uint256): 2305
|
// b(uint256): 2305
|
||||||
|
@ -11,9 +11,9 @@ contract Medium {
|
|||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 253200
|
// codeDepositCost: 253800
|
||||||
// executionCost: 294
|
// executionCost: 294
|
||||||
// totalCost: 253494
|
// totalCost: 254094
|
||||||
// external:
|
// external:
|
||||||
// a(): 1028
|
// a(): 1028
|
||||||
// b(uint256): 2046
|
// b(uint256): 2046
|
||||||
|
@ -14,9 +14,9 @@ contract Medium {
|
|||||||
// optimize-runs: 2
|
// optimize-runs: 2
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 141000
|
// codeDepositCost: 141600
|
||||||
// executionCost: 190
|
// executionCost: 190
|
||||||
// totalCost: 141190
|
// totalCost: 141790
|
||||||
// external:
|
// external:
|
||||||
// a(): 998
|
// a(): 998
|
||||||
// b(uint256): 2063
|
// b(uint256): 2063
|
||||||
|
@ -6,9 +6,9 @@ contract Small {
|
|||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 84800
|
// codeDepositCost: 85400
|
||||||
// executionCost: 135
|
// executionCost: 135
|
||||||
// totalCost: 84935
|
// totalCost: 85535
|
||||||
// external:
|
// external:
|
||||||
// fallback: 129
|
// fallback: 129
|
||||||
// a(): 983
|
// a(): 983
|
||||||
|
@ -9,9 +9,9 @@ contract Small {
|
|||||||
// optimize-runs: 2
|
// optimize-runs: 2
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 60600
|
// codeDepositCost: 61200
|
||||||
// executionCost: 111
|
// executionCost: 111
|
||||||
// totalCost: 60711
|
// totalCost: 61311
|
||||||
// external:
|
// external:
|
||||||
// fallback: 118
|
// fallback: 118
|
||||||
// a(): 976
|
// a(): 976
|
||||||
|
Loading…
Reference in New Issue
Block a user