This commit is contained in:
Marenz 2022-10-04 01:14:00 +02:00
parent 2dc5435c19
commit 0f08a06046
8 changed files with 42 additions and 48 deletions

View File

@ -664,7 +664,22 @@ bool AsmAnalyzer::validateInstructions(std::string const& _instructionIdentifier
{ {
auto const builtin = EVMDialect::strictAssemblyForEVM(EVMVersion{}).builtin(YulString(_instructionIdentifier)); auto const builtin = EVMDialect::strictAssemblyForEVM(EVMVersion{}).builtin(YulString(_instructionIdentifier));
if (builtin && builtin->instruction.has_value()) if (builtin && builtin->instruction.has_value())
{
if (_instructionIdentifier == "prevrandao" && !m_evmVersion.hasPrevRandao())
m_errorReporter.warning(
5761_error,
_location,
"\"prevrandao\" is not supported by the VM version and will be treated like \"difficulty\"."
);
else if (_instructionIdentifier == "difficulty" && m_evmVersion.hasPrevRandao())
m_errorReporter.warning(
3242_error,
_location,
"\"difficulty\" was renamed and supplanted by \"prevrandao\" in the VM version paris."
);
return validateInstructions(builtin->instruction.value(), _location); return validateInstructions(builtin->instruction.value(), _location);
}
else else
return false; return false;
} }
@ -684,6 +699,8 @@ bool AsmAnalyzer::validateInstructions(evmasm::Instruction _instr, SourceLocatio
_instr != evmasm::Instruction::JUMPDEST, _instr != evmasm::Instruction::JUMPDEST,
""); "");
bool returnValue = true;
auto errorForVM = [&](ErrorId _errorId, string const& vmKindMessage) { auto errorForVM = [&](ErrorId _errorId, string const& vmKindMessage) {
m_errorReporter.typeError( m_errorReporter.typeError(
_errorId, _errorId,
@ -695,6 +712,7 @@ bool AsmAnalyzer::validateInstructions(evmasm::Instruction _instr, SourceLocatio
fmt::arg("version", m_evmVersion.name()) fmt::arg("version", m_evmVersion.name())
) )
); );
returnValue = false;
}; };
if (_instr == evmasm::Instruction::RETURNDATACOPY && !m_evmVersion.supportsReturndata()) if (_instr == evmasm::Instruction::RETURNDATACOPY && !m_evmVersion.supportsReturndata())
@ -727,10 +745,8 @@ bool AsmAnalyzer::validateInstructions(evmasm::Instruction _instr, SourceLocatio
"PC instruction is a low-level EVM feature. " "PC instruction is a low-level EVM feature. "
"Because of that PC is disallowed in strict assembly." "Because of that PC is disallowed in strict assembly."
); );
else
return false;
return true; return returnValue;
} }
bool AsmAnalyzer::validateInstructions(FunctionCall const& _functionCall) bool AsmAnalyzer::validateInstructions(FunctionCall const& _functionCall)

View File

@ -146,7 +146,7 @@ set<YulString> createReservedIdentifiers(langutil::EVMVersion _evmVersion)
map<YulString, BuiltinFunctionForEVM> createBuiltins(langutil::EVMVersion _evmVersion, bool _objectAccess) map<YulString, BuiltinFunctionForEVM> createBuiltins(langutil::EVMVersion _evmVersion, bool _objectAccess)
{ {
auto hasOpCode = [&](evmasm::Instruction _instr, string const& _instrName) -> bool /*auto hasOpCode = [&](evmasm::Instruction _instr, string const& _instrName) -> bool
{ {
if ( if (
_instr == evmasm::Instruction::PREVRANDAO && _instr == evmasm::Instruction::PREVRANDAO &&
@ -155,7 +155,7 @@ map<YulString, BuiltinFunctionForEVM> createBuiltins(langutil::EVMVersion _evmVe
return _evmVersion.hasPrevRandao(); return _evmVersion.hasPrevRandao();
return _evmVersion.hasOpcode(_instr); return _evmVersion.hasOpcode(_instr);
}; };*/
map<YulString, BuiltinFunctionForEVM> builtins; map<YulString, BuiltinFunctionForEVM> builtins;
for (auto const& instr: evmasm::c_instructions) for (auto const& instr: evmasm::c_instructions)
@ -170,7 +170,7 @@ map<YulString, BuiltinFunctionForEVM> createBuiltins(langutil::EVMVersion _evmVe
opcode != evmasm::Instruction::JUMP && opcode != evmasm::Instruction::JUMP &&
opcode != evmasm::Instruction::JUMPI && opcode != evmasm::Instruction::JUMPI &&
opcode != evmasm::Instruction::JUMPDEST && opcode != evmasm::Instruction::JUMPDEST &&
hasOpCode(opcode, name) _evmVersion.hasOpcode(opcode)
) )
builtins.emplace(createEVMFunction(name, opcode)); builtins.emplace(createEVMFunction(name, opcode));
} }

View File

@ -4,4 +4,4 @@ function f() view returns (uint) {
// ==== // ====
// EVMVersion: >=paris // EVMVersion: >=paris
// ---- // ----
// Warning 8417: (43-59): "difficulty" was renamed and supplanted by "prevrandao" in the VM version paris. // Warning 8417: (46-62): "difficulty" was renamed and supplanted by "prevrandao" in the VM version paris.

View File

@ -4,4 +4,4 @@ function f() view returns (uint) {
// ==== // ====
// EVMVersion: <paris // EVMVersion: <paris
// ---- // ----
// Warning 9432: (43-59): "prevrandao" is not supported by the VM version and will be treated like "difficulty". // Warning 9432: (46-62): "prevrandao" is not supported by the VM version and will be treated like "difficulty".

View File

@ -73,7 +73,7 @@ contract C {
pop(coinbase()) pop(coinbase())
pop(timestamp()) pop(timestamp())
pop(number()) pop(number())
pop(difficulty()) pop(prevrandao())
pop(gaslimit()) pop(gaslimit())
// NOTE: msize() is allowed only with optimizer disabled // NOTE: msize() is allowed only with optimizer disabled
@ -83,7 +83,7 @@ contract C {
} }
} }
// ==== // ====
// EVMVersion: >=london // EVMVersion: >=paris
// ---- // ----
// Warning 5740: (89-1716): Unreachable code. // Warning 5740: (89-1716): Unreachable code.
// Warning 5740: (1729-1741): Unreachable code. // Warning 5740: (1729-1741): Unreachable code.

View File

@ -0,0 +1,15 @@
contract C {
function f() public {
assembly {
pop(difficulty())
}
}
}
// ====
// EVMVersion: =london
// ----
// Warning 5740: (89-1716): Unreachable code.
// Warning 5740: (1729-1741): Unreachable code.
// Warning 5740: (1754-1769): Unreachable code.
// Warning 5740: (1782-1791): Unreachable code.
// Warning 5740: (1804-2215): Unreachable code.

View File

@ -9,7 +9,3 @@ contract C {
// ==== // ====
// EVMVersion: =london // EVMVersion: =london
// ---- // ----
// Warning 5740: (94-1733): Unreachable code.
// Warning 5740: (1746-1758): Unreachable code.
// Warning 5740: (1801-1810): Unreachable code.
// Warning 5740: (1978-2244): Unreachable code.

View File

@ -9,37 +9,4 @@ contract C {
// ==== // ====
// EVMVersion: =london // EVMVersion: =london
// ---- // ----
// Warning 5740: (672-1083): Unreachable code. // TypeError 2527: (111-123): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (79-87): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 8961: (101-113): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 2527: (130-135): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (153-162): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (180-190): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (208-221): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (239-247): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (265-276): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (294-308): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (322-345): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (362-376): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 8961: (394-409): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (427-446): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (464-489): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (507-536): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (554-584): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 2527: (602-630): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 8961: (644-659): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (672-682): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (695-708): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (721-737): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (750-769): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 8961: (782-804): Function cannot be declared as pure because this expression (potentially) modifies the state.
// TypeError 2527: (821-830): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (848-857): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (875-883): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (901-911): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (929-941): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (959-969): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (987-998): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (1016-1024): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (1042-1054): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
// TypeError 2527: (1072-1082): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".