mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
More aggressive runtime code exclusion.
This commit is contained in:
parent
e147654f92
commit
07750ea23a
@ -8,6 +8,7 @@ Compiler Features:
|
|||||||
|
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
* Code Generator: Avoid including references to the deployed label of referenced functions if they are called right away.
|
||||||
* ContractLevelChecker: Properly distinguish the case of missing base constructor arguments from having an unimplemented base function.
|
* ContractLevelChecker: Properly distinguish the case of missing base constructor arguments from having an unimplemented base function.
|
||||||
* SMTChecker: Fix internal error when using the custom NatSpec annotation to abstract free functions.
|
* SMTChecker: Fix internal error when using the custom NatSpec annotation to abstract free functions.
|
||||||
* TypeChecker: Also allow external library functions in ``using for``.
|
* TypeChecker: Also allow external library functions in ``using for``.
|
||||||
|
@ -632,29 +632,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
|
|||||||
evmasm::AssemblyItem returnLabel = m_context.pushNewTag();
|
evmasm::AssemblyItem returnLabel = m_context.pushNewTag();
|
||||||
for (unsigned i = 0; i < arguments.size(); ++i)
|
for (unsigned i = 0; i < arguments.size(); ++i)
|
||||||
acceptAndConvert(*arguments[i], *function.parameterTypes()[i]);
|
acceptAndConvert(*arguments[i], *function.parameterTypes()[i]);
|
||||||
|
_functionCall.expression().accept(*this);
|
||||||
{
|
|
||||||
bool shortcutTaken = false;
|
|
||||||
if (auto identifier = dynamic_cast<Identifier const*>(&_functionCall.expression()))
|
|
||||||
{
|
|
||||||
solAssert(!function.hasBoundFirstArgument(), "");
|
|
||||||
if (auto functionDef = dynamic_cast<FunctionDefinition const*>(identifier->annotation().referencedDeclaration))
|
|
||||||
{
|
|
||||||
// Do not directly visit the identifier, because this way, we can avoid
|
|
||||||
// the runtime entry label to be created at the creation time context.
|
|
||||||
CompilerContext::LocationSetter locationSetter2(m_context, *identifier);
|
|
||||||
solAssert(*identifier->annotation().requiredLookup == VirtualLookup::Virtual, "");
|
|
||||||
utils().pushCombinedFunctionEntryLabel(
|
|
||||||
functionDef->resolveVirtual(m_context.mostDerivedContract()),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
shortcutTaken = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!shortcutTaken)
|
|
||||||
_functionCall.expression().accept(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned parameterSize = CompilerUtils::sizeOnStack(function.parameterTypes());
|
unsigned parameterSize = CompilerUtils::sizeOnStack(function.parameterTypes());
|
||||||
if (function.hasBoundFirstArgument())
|
if (function.hasBoundFirstArgument())
|
||||||
@ -1486,7 +1464,11 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
|
|||||||
{
|
{
|
||||||
FunctionDefinition const& funDef = dynamic_cast<decltype(funDef)>(funType->declaration());
|
FunctionDefinition const& funDef = dynamic_cast<decltype(funDef)>(funType->declaration());
|
||||||
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Static, "");
|
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Static, "");
|
||||||
utils().pushCombinedFunctionEntryLabel(funDef);
|
utils().pushCombinedFunctionEntryLabel(
|
||||||
|
funDef,
|
||||||
|
// If we call directly, do not include the second label.
|
||||||
|
!_memberAccess.annotation().calledDirectly
|
||||||
|
);
|
||||||
utils().moveIntoStack(funType->selfType()->sizeOnStack(), 1);
|
utils().moveIntoStack(funType->selfType()->sizeOnStack(), 1);
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
@ -1519,10 +1501,14 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
|
|||||||
_memberAccess.expression().accept(*this);
|
_memberAccess.expression().accept(*this);
|
||||||
solAssert(_memberAccess.annotation().referencedDeclaration, "Referenced declaration not resolved.");
|
solAssert(_memberAccess.annotation().referencedDeclaration, "Referenced declaration not resolved.");
|
||||||
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Super, "");
|
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Super, "");
|
||||||
utils().pushCombinedFunctionEntryLabel(m_context.superFunction(
|
utils().pushCombinedFunctionEntryLabel(
|
||||||
dynamic_cast<FunctionDefinition const&>(*_memberAccess.annotation().referencedDeclaration),
|
m_context.superFunction(
|
||||||
contractType->contractDefinition()
|
dynamic_cast<FunctionDefinition const&>(*_memberAccess.annotation().referencedDeclaration),
|
||||||
));
|
contractType->contractDefinition()
|
||||||
|
),
|
||||||
|
// If we call directly, do not include the second label.
|
||||||
|
!_memberAccess.annotation().calledDirectly
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1541,7 +1527,11 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
|
|||||||
if (auto const* function = dynamic_cast<FunctionDefinition const*>(_memberAccess.annotation().referencedDeclaration))
|
if (auto const* function = dynamic_cast<FunctionDefinition const*>(_memberAccess.annotation().referencedDeclaration))
|
||||||
{
|
{
|
||||||
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Static, "");
|
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Static, "");
|
||||||
utils().pushCombinedFunctionEntryLabel(*function);
|
utils().pushCombinedFunctionEntryLabel(
|
||||||
|
*function,
|
||||||
|
// If we call directly, do not include the second label.
|
||||||
|
!_memberAccess.annotation().calledDirectly
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
solAssert(false, "Function not found in member access");
|
solAssert(false, "Function not found in member access");
|
||||||
@ -2025,7 +2015,11 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
|
|||||||
solAssert(function && function->isFree(), "");
|
solAssert(function && function->isFree(), "");
|
||||||
solAssert(funType->kind() == FunctionType::Kind::Internal, "");
|
solAssert(funType->kind() == FunctionType::Kind::Internal, "");
|
||||||
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Static, "");
|
solAssert(*_memberAccess.annotation().requiredLookup == VirtualLookup::Static, "");
|
||||||
utils().pushCombinedFunctionEntryLabel(*function);
|
utils().pushCombinedFunctionEntryLabel(
|
||||||
|
*function,
|
||||||
|
// If we call directly, do not include the second label.
|
||||||
|
!_memberAccess.annotation().calledDirectly
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else if (auto const* contract = dynamic_cast<ContractDefinition const*>(_memberAccess.annotation().referencedDeclaration))
|
else if (auto const* contract = dynamic_cast<ContractDefinition const*>(_memberAccess.annotation().referencedDeclaration))
|
||||||
{
|
{
|
||||||
@ -2223,12 +2217,14 @@ void ExpressionCompiler::endVisit(Identifier const& _identifier)
|
|||||||
}
|
}
|
||||||
else if (FunctionDefinition const* functionDef = dynamic_cast<FunctionDefinition const*>(declaration))
|
else if (FunctionDefinition const* functionDef = dynamic_cast<FunctionDefinition const*>(declaration))
|
||||||
{
|
{
|
||||||
// If the identifier is called right away, this code is executed in visit(FunctionCall...), because
|
|
||||||
// we want to avoid having a reference to the runtime function entry point in the
|
|
||||||
// constructor context, since this would force the compiler to include unreferenced
|
|
||||||
// internal functions in the runtime context.
|
|
||||||
solAssert(*_identifier.annotation().requiredLookup == VirtualLookup::Virtual, "");
|
solAssert(*_identifier.annotation().requiredLookup == VirtualLookup::Virtual, "");
|
||||||
utils().pushCombinedFunctionEntryLabel(functionDef->resolveVirtual(m_context.mostDerivedContract()));
|
utils().pushCombinedFunctionEntryLabel(
|
||||||
|
functionDef->resolveVirtual(m_context.mostDerivedContract()),
|
||||||
|
// If we call directly, do not include the second (potential runtime) label.
|
||||||
|
// Including the label might lead to the runtime code being included in the creation
|
||||||
|
// code even though it is never executed.
|
||||||
|
!_identifier.annotation().calledDirectly
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else if (auto variable = dynamic_cast<VariableDeclaration const*>(declaration))
|
else if (auto variable = dynamic_cast<VariableDeclaration const*>(declaration))
|
||||||
appendVariable(*variable, static_cast<Expression const&>(_identifier));
|
appendVariable(*variable, static_cast<Expression const&>(_identifier));
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
function longdata(S memory) pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
uint x;
|
||||||
|
}
|
||||||
|
|
||||||
|
using { longdata } for S;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
bytes data;
|
||||||
|
constructor() {
|
||||||
|
S memory x;
|
||||||
|
data = x.longdata();
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
// Tests that the function longdata is not
|
||||||
|
// included in the runtime code.
|
||||||
|
uint x;
|
||||||
|
assembly {
|
||||||
|
x := codesize()
|
||||||
|
}
|
||||||
|
return x < data.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,34 @@
|
|||||||
|
library L {
|
||||||
|
function longdata() pure internal returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contract C {
|
||||||
|
bytes data;
|
||||||
|
constructor() {
|
||||||
|
data = L.longdata();
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
// Tests that the function L.longdata is not
|
||||||
|
// included in the runtime code.
|
||||||
|
uint x;
|
||||||
|
assembly {
|
||||||
|
x := codesize()
|
||||||
|
}
|
||||||
|
return x < data.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,31 @@
|
|||||||
|
library L {
|
||||||
|
function longdata() pure internal returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
bytes data;
|
||||||
|
function () pure returns (bytes memory) f;
|
||||||
|
constructor() {
|
||||||
|
data = L.longdata();
|
||||||
|
f = L.longdata;
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
return keccak256(data) == keccak256(f());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,36 @@
|
|||||||
|
==== Source: mod.sol ====
|
||||||
|
function longdata() pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
==== Source: main.sol ====
|
||||||
|
import "mod.sol" as M;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
bytes data;
|
||||||
|
constructor() {
|
||||||
|
data = M.longdata();
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
// Tests that the function longdata is not
|
||||||
|
// included in the runtime code.
|
||||||
|
uint x;
|
||||||
|
assembly {
|
||||||
|
x := codesize()
|
||||||
|
}
|
||||||
|
return x < data.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,32 @@
|
|||||||
|
==== Source: mod.sol ====
|
||||||
|
function longdata() pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
==== Source: main.sol ====
|
||||||
|
import "mod.sol" as M;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
bytes data;
|
||||||
|
function () pure returns (bytes memory) f;
|
||||||
|
constructor() {
|
||||||
|
data = M.longdata();
|
||||||
|
f = M.longdata;
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
return keccak256(data) == keccak256(f());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,35 @@
|
|||||||
|
abstract contract S {
|
||||||
|
function longdata() internal pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C is S {
|
||||||
|
bytes data;
|
||||||
|
constructor() {
|
||||||
|
data = S.longdata();
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
// Tests that the function longdata is not
|
||||||
|
// included in the runtime code.
|
||||||
|
uint x;
|
||||||
|
assembly {
|
||||||
|
x := codesize()
|
||||||
|
}
|
||||||
|
return x < data.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,31 @@
|
|||||||
|
abstract contract S {
|
||||||
|
function longdata() internal pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C is S {
|
||||||
|
bytes data;
|
||||||
|
function () pure returns (bytes memory) f;
|
||||||
|
constructor() {
|
||||||
|
data = S.longdata();
|
||||||
|
f = S.longdata;
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
return keccak256(data) == keccak256(f());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,35 @@
|
|||||||
|
abstract contract S {
|
||||||
|
function longdata() internal pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C is S {
|
||||||
|
bytes data;
|
||||||
|
constructor() {
|
||||||
|
data = super.longdata();
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
// Tests that the function longdata is not
|
||||||
|
// included in the runtime code.
|
||||||
|
uint x;
|
||||||
|
assembly {
|
||||||
|
x := codesize()
|
||||||
|
}
|
||||||
|
return x < data.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,31 @@
|
|||||||
|
abstract contract S {
|
||||||
|
function longdata() internal pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C is S {
|
||||||
|
bytes data;
|
||||||
|
function () pure returns (bytes memory) f;
|
||||||
|
constructor() {
|
||||||
|
data = super.longdata();
|
||||||
|
f = super.longdata;
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
return keccak256(data) == keccak256(f());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,39 @@
|
|||||||
|
abstract contract S {
|
||||||
|
function longdata() internal virtual pure returns (bytes memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract contract X is S {
|
||||||
|
function longdata() internal override pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C is X {
|
||||||
|
bytes data;
|
||||||
|
constructor() {
|
||||||
|
data = longdata();
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
// Tests that the function longdata is not
|
||||||
|
// included in the runtime code.
|
||||||
|
uint x;
|
||||||
|
assembly {
|
||||||
|
x := codesize()
|
||||||
|
}
|
||||||
|
return x < data.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
@ -0,0 +1,35 @@
|
|||||||
|
abstract contract S {
|
||||||
|
function longdata() internal virtual pure returns (bytes memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract contract X is S {
|
||||||
|
function longdata() internal override pure returns (bytes memory) {
|
||||||
|
return
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
" .RPOKIDAS,.CKUMT.,ORKAD ,NOKIDHA .CGKIAD OVHAMS CUAOGT DAKN OIT"
|
||||||
|
"xasopca.pngaibngidak.jbtnudak.cAP.BRRSMCPJAGPD KIAJDOMHUKR,SCPID"
|
||||||
|
"M,SEYBDXCNTKIMNJGO;DUIAQBQUEHAKMPGIDSAJCOUKANJBCUEBKNA.GIAKMV.TI"
|
||||||
|
"AJMO<KXBANJCPGUD ABKCJIDHA NKIMAJU,EKAMHSO;PYCAKUM,L.UCA MR;KITA"
|
||||||
|
"apibakrpidbacnidkacjadtnpdkylca.,jda,r.kuadc,jdlkjd',c'dj, ncg d"
|
||||||
|
"anosumantkudkc,djntudkantuadnc,ui,c.ud,.nujdncud,j.rsch'pkl.'pih";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract C is X {
|
||||||
|
bytes data;
|
||||||
|
function () pure returns (bytes memory) f;
|
||||||
|
constructor() {
|
||||||
|
data = super.longdata();
|
||||||
|
f = super.longdata;
|
||||||
|
}
|
||||||
|
function test() public view returns (bool) {
|
||||||
|
return keccak256(data) == keccak256(f());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// test() -> true
|
Loading…
Reference in New Issue
Block a user