mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #11180 from ethereum/fix-trace-diff-fp
Fix false positive caused by early termination due to nested expressi…
This commit is contained in:
commit
c37bf89384
@ -86,7 +86,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
|
||||
stack.parserResult()->code,
|
||||
EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion())
|
||||
);
|
||||
if (termReason == yulFuzzerUtil::TerminationReason::StepLimitReached)
|
||||
if (yulFuzzerUtil::resourceLimitsExceeded(termReason))
|
||||
return 0;
|
||||
|
||||
stack.optimize();
|
||||
@ -97,6 +97,9 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
|
||||
(yul::test::yul_fuzzer::yulFuzzerUtil::maxSteps * 4)
|
||||
);
|
||||
|
||||
if (yulFuzzerUtil::resourceLimitsExceeded(termReason))
|
||||
return 0;
|
||||
|
||||
bool isTraceEq = (os1.str() == os2.str());
|
||||
yulAssert(isTraceEq, "Interpreted traces for optimized and unoptimized code differ.");
|
||||
return 0;
|
||||
|
@ -73,3 +73,11 @@ yulFuzzerUtil::TerminationReason yulFuzzerUtil::interpret(
|
||||
state.dumpTraceAndState(_os);
|
||||
return reason;
|
||||
}
|
||||
|
||||
bool yulFuzzerUtil::resourceLimitsExceeded(TerminationReason _reason)
|
||||
{
|
||||
return
|
||||
_reason == yulFuzzerUtil::TerminationReason::StepLimitReached ||
|
||||
_reason == yulFuzzerUtil::TerminationReason::TraceLimitReached ||
|
||||
_reason == yulFuzzerUtil::TerminationReason::ExpresionNestingLimitReached;
|
||||
}
|
||||
|
@ -40,6 +40,11 @@ struct yulFuzzerUtil
|
||||
size_t _maxTraceSize = maxTraceSize,
|
||||
size_t _maxExprNesting = maxExprNesting
|
||||
);
|
||||
|
||||
/// @returns true if @param _reason for Yul interpreter terminating is
|
||||
/// resource exhaustion of some form e.g., exceeded maximum time-out
|
||||
/// threshold, number of nested expressions etc.
|
||||
static bool resourceLimitsExceeded(TerminationReason _reason);
|
||||
static size_t constexpr maxSteps = 100;
|
||||
static size_t constexpr maxTraceSize = 75;
|
||||
static size_t constexpr maxExprNesting = 64;
|
||||
|
@ -100,11 +100,7 @@ DEFINE_PROTO_FUZZER(Program const& _input)
|
||||
EVMDialect::strictAssemblyForEVMObjects(version)
|
||||
);
|
||||
|
||||
if (
|
||||
termReason == yulFuzzerUtil::TerminationReason::StepLimitReached ||
|
||||
termReason == yulFuzzerUtil::TerminationReason::TraceLimitReached ||
|
||||
termReason == yulFuzzerUtil::TerminationReason::ExpresionNestingLimitReached
|
||||
)
|
||||
if (yulFuzzerUtil::resourceLimitsExceeded(termReason))
|
||||
return;
|
||||
|
||||
YulOptimizerTestCommon optimizerTest(
|
||||
@ -119,11 +115,7 @@ DEFINE_PROTO_FUZZER(Program const& _input)
|
||||
astBlock,
|
||||
EVMDialect::strictAssemblyForEVMObjects(version)
|
||||
);
|
||||
if (
|
||||
termReason == yulFuzzerUtil::TerminationReason::StepLimitReached ||
|
||||
termReason == yulFuzzerUtil::TerminationReason::TraceLimitReached ||
|
||||
termReason == yulFuzzerUtil::TerminationReason::ExpresionNestingLimitReached
|
||||
)
|
||||
if (yulFuzzerUtil::resourceLimitsExceeded(termReason))
|
||||
return;
|
||||
|
||||
bool isTraceEq = (os1.str() == os2.str());
|
||||
|
Loading…
Reference in New Issue
Block a user