Update existing and add new test cases.

This commit is contained in:
Bhargava Shastry
2023-02-02 11:40:39 +01:00
parent f8880cad82
commit 5c6e12b2c0
10 changed files with 197 additions and 53 deletions
@@ -216,8 +216,7 @@ u256 EVMInstructionInterpreter::eval(
m_state.memory, m_state.calldata,
size_t(arg[0]), size_t(arg[1]), size_t(arg[2])
);
if (arg[2] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::CODESIZE:
return m_state.code.size();
@@ -227,8 +226,7 @@ u256 EVMInstructionInterpreter::eval(
m_state.memory, m_state.code,
size_t(arg[0]), size_t(arg[1]), size_t(arg[2])
);
if (arg[2] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::GASPRICE:
return m_state.gasprice;
@@ -247,8 +245,7 @@ u256 EVMInstructionInterpreter::eval(
m_state.memory, m_state.code,
size_t(arg[1]), size_t(arg[2]), size_t(arg[3])
);
if (arg[3] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::RETURNDATASIZE:
return m_state.returndata.size();
@@ -258,8 +255,7 @@ u256 EVMInstructionInterpreter::eval(
m_state.memory, m_state.returndata,
size_t(arg[0]), size_t(arg[1]), size_t(arg[2])
);
if (arg[2] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::BLOCKHASH:
if (arg[0] >= m_state.blockNumber || arg[0] + 256 < m_state.blockNumber)
@@ -301,54 +297,44 @@ u256 EVMInstructionInterpreter::eval(
return 0x99;
case Instruction::LOG0:
accessMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::LOG1:
accessMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::LOG2:
accessMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::LOG3:
accessMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
case Instruction::LOG4:
accessMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
return 0;
// --------------- calls ---------------
case Instruction::CREATE:
accessMemory(arg[1], arg[2]);
logTrace(_instruction, arg);
if (arg[2] != 0)
{
logTrace(_instruction, arg);
return (0xcccccc + arg[1]) & u256("0xffffffffffffffffffffffffffffffffffffffff");
}
return 0xcccccc;
else
return 0xcccccc;
case Instruction::CREATE2:
accessMemory(arg[1], arg[2]);
logTrace(_instruction, arg);
if (arg[2] != 0)
{
logTrace(_instruction, arg);
return (0xdddddd + arg[1]) & u256("0xffffffffffffffffffffffffffffffffffffffff");
}
return 0xdddddd;
else
return 0xdddddd;
case Instruction::CALL:
case Instruction::CALLCODE:
if (arg[4] != 0)
accessMemory(arg[3], arg[4]);
if (arg[6] != 0)
accessMemory(arg[5], arg[6]);
if (arg[4] != 0 && arg[6] != 0)
logTrace(_instruction, arg);
accessMemory(arg[3], arg[4]);
accessMemory(arg[5], arg[6]);
logTrace(_instruction, arg);
// Randomly fail based on the called address if it isn't a call to self.
// Used for fuzzing.
return (
@@ -357,12 +343,9 @@ u256 EVMInstructionInterpreter::eval(
) ? 1 : 0;
case Instruction::DELEGATECALL:
case Instruction::STATICCALL:
if (arg[3] != 0)
accessMemory(arg[2], arg[3]);
if (arg[5] != 0)
accessMemory(arg[4], arg[5]);
if (arg[3] != 0 && arg[5] != 0)
logTrace(_instruction, arg);
accessMemory(arg[2], arg[3]);
accessMemory(arg[4], arg[5]);
logTrace(_instruction, arg);
// Randomly fail based on the called address if it isn't a call to self.
// Used for fuzzing.
return (
@@ -374,16 +357,13 @@ u256 EVMInstructionInterpreter::eval(
m_state.returndata = {};
if (accessMemory(arg[0], arg[1]))
m_state.returndata = m_state.readMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg, m_state.returndata);
logTrace(_instruction, arg, m_state.returndata);
BOOST_THROW_EXCEPTION(ExplicitlyTerminatedWithReturn());
}
case Instruction::REVERT:
accessMemory(arg[0], arg[1]);
if (arg[1] != 0)
logTrace(_instruction, arg);
logTrace(_instruction, arg);
m_state.storage.clear();
m_state.trace.clear();
BOOST_THROW_EXCEPTION(ExplicitlyTerminated());
case Instruction::INVALID:
logTrace(_instruction);
@@ -611,7 +591,7 @@ std::pair<bool, size_t> EVMInstructionInterpreter::isInputMemoryPtrModified(
std::vector<u256> const& _arguments
)
{
if (_pseudoInstruction == "return" || _pseudoInstruction == "revert")
if (_pseudoInstruction == "RETURN" || _pseudoInstruction == "REVERT")
{
if (_arguments[1] == 0)
return {true, 0};
@@ -619,15 +599,15 @@ std::pair<bool, size_t> EVMInstructionInterpreter::isInputMemoryPtrModified(
return {false, 0};
}
else if (
_pseudoInstruction == "returndatacopy" || _pseudoInstruction == "calldatacopy"
|| _pseudoInstruction == "codecopy")
_pseudoInstruction == "RETURNDATACOPY" || _pseudoInstruction == "CALLDATACOPY"
|| _pseudoInstruction == "CODECOPY")
{
if (_arguments[2] == 0)
return {true, 0};
else
return {false, 0};
}
else if (_pseudoInstruction == "extcodedatacopy")
else if (_pseudoInstruction == "EXTCODECOPY")
{
if (_arguments[3] == 0)
return {true, 1};
@@ -635,29 +615,29 @@ std::pair<bool, size_t> EVMInstructionInterpreter::isInputMemoryPtrModified(
return {false, 0};
}
else if (
_pseudoInstruction == "log0" || _pseudoInstruction == "log1" || _pseudoInstruction == "log2"
|| _pseudoInstruction == "log3" || _pseudoInstruction == "log4")
_pseudoInstruction == "LOG0" || _pseudoInstruction == "LOG1" || _pseudoInstruction == "LOG2"
|| _pseudoInstruction == "LOG3" || _pseudoInstruction == "LOG4")
{
if (_arguments[1] == 0)
return {true, 0};
else
return {false, 0};
}
if (_pseudoInstruction == "create" || _pseudoInstruction == "create2")
if (_pseudoInstruction == "CREATE" || _pseudoInstruction == "CREATE2")
{
if (_arguments[2] == 0)
return {true, 1};
else
return {false, 0};
}
if (_pseudoInstruction == "call" || _pseudoInstruction == "callcode")
if (_pseudoInstruction == "CALL" || _pseudoInstruction == "CALLCODE")
{
if (_arguments[4] == 0)
return {true, 3};
else
return {false, 0};
}
else if (_pseudoInstruction == "delegatecall" || _pseudoInstruction == "staticcall")
else if (_pseudoInstruction == "DELEGATECALL" || _pseudoInstruction == "STATICCALL")
{
if (_arguments[3] == 0)
return {true, 2};