Changing enforceGasCost functionality.

This commit is contained in:
Djordje Mijovic 2021-02-12 12:55:07 +01:00
parent 2b14efbbcc
commit 06171a3100
3 changed files with 25 additions and 17 deletions

View File

@ -103,8 +103,8 @@ CommonOptions::CommonOptions(std::string _caption):
("no-smt", po::bool_switch(&disableSMT), "disable SMT checker") ("no-smt", po::bool_switch(&disableSMT), "disable SMT checker")
("optimize", po::bool_switch(&optimize), "enables optimization") ("optimize", po::bool_switch(&optimize), "enables optimization")
("enforce-via-yul", po::bool_switch(&enforceViaYul), "Enforce compiling all tests via yul to see if additional tests can be activated.") ("enforce-via-yul", po::bool_switch(&enforceViaYul), "Enforce compiling all tests via yul to see if additional tests can be activated.")
("enforce-gas-cost", po::bool_switch(&enforceGasTest), "Enforce gas cost expectations in semantic tests.") ("enforce-gas-cost", po::bool_switch(&enforceGasTest), "Enforce checking gas cost in semantic tests.")
("enforce-gas-cost-min-value", po::value(&enforceGasTestMinValue), "Threshold value when enforcing gas cost expectations.") ("enforce-gas-cost-min-value", po::value(&enforceGasTestMinValue), "Threshold value to enforce adding gas checks to a test.")
("abiencoderv1", po::bool_switch(&useABIEncoderV1), "enables abi encoder v1") ("abiencoderv1", po::bool_switch(&useABIEncoderV1), "enables abi encoder v1")
("show-messages", po::bool_switch(&showMessages), "enables message output") ("show-messages", po::bool_switch(&showMessages), "enables message output")
("show-metadata", po::bool_switch(&showMetadata), "enables metadata output"); ("show-metadata", po::bool_switch(&showMetadata), "enables metadata output");
@ -122,12 +122,19 @@ void CommonOptions::validate() const
ConfigException, ConfigException,
"Invalid test path specified." "Invalid test path specified."
); );
if (enforceGasTest)
{
assertThrow( assertThrow(
!enforceGasTest || evmVersion() == langutil::EVMVersion{}, evmVersion() == langutil::EVMVersion{},
ConfigException, ConfigException,
"Gas costs can only be enforced on latest evm version." "Gas costs can only be enforced on latest evm version."
); );
assertThrow(
useABIEncoderV1 == false,
ConfigException,
"Gas costs can only be enforced on abi encoder v2."
);
}
} }
bool CommonOptions::parse(int argc, char const* const* argv) bool CommonOptions::parse(int argc, char const* const* argv)

View File

@ -76,8 +76,8 @@ int registerTests(
solidity::test::CommonOptions::get().evmVersion(), solidity::test::CommonOptions::get().evmVersion(),
solidity::test::CommonOptions::get().vmPaths, solidity::test::CommonOptions::get().vmPaths,
_enforceViaYul, _enforceViaYul,
/* enforceGasCost */ false, solidity::test::CommonOptions::get().enforceGasTest,
0 solidity::test::CommonOptions::get().enforceGasTestMinValue
}; };
if (fs::is_directory(fullpath)) if (fs::is_directory(fullpath))
{ {

View File

@ -115,9 +115,9 @@ SemanticTest::SemanticTest(
parseExpectations(m_reader.stream()); parseExpectations(m_reader.stream());
soltestAssert(!m_tests.empty(), "No tests specified in " + _filename); soltestAssert(!m_tests.empty(), "No tests specified in " + _filename);
if (_evmVersion == EVMVersion{}) if (m_enforceGasCost)
{ {
m_compiler.setVersionType(CompilerStack::VersionType::Empty); m_compiler.setMetadataFormat(CompilerStack::MetadataFormat::NoMetadata);
m_compiler.setMetadataHash(CompilerStack::MetadataHash::None); m_compiler.setMetadataHash(CompilerStack::MetadataHash::None);
} }
} }
@ -342,20 +342,21 @@ bool SemanticTest::checkGasCostExpectation(TestFunctionCall& io_test, bool _comp
(_compileViaYul ? "ir"s : "legacy"s) + (_compileViaYul ? "ir"s : "legacy"s) +
(m_optimiserSettings == OptimiserSettings::full() ? "Optimized" : ""); (m_optimiserSettings == OptimiserSettings::full() ? "Optimized" : "");
// We don't check gas if evm is not set to default version // We don't check gas if enforce gas cost is not active
// or in case we run abiencoderv1 // or test is run with abi encoder v1 only
// or gas used less than threshold for enforcing feature // or gas used less than threshold for enforcing feature
// or setting is "ir" and it's not included in expectations // or setting is "ir" and it's not included in expectations
if ( if (
m_evmVersion != EVMVersion{} || !m_enforceGasCost ||
solidity::test::CommonOptions::get().useABIEncoderV1 ||
( (
(!m_enforceGasCost || setting == "ir" || m_gasUsed < m_enforceGasCostMinValue) && (setting == "ir" || m_gasUsed < m_enforceGasCostMinValue) &&
io_test.call().expectations.gasUsed.count(setting) == 0 io_test.call().expectations.gasUsed.count(setting) == 0
) )
) )
return true; return true;
solAssert(!m_runWithABIEncoderV1Only, "");
io_test.setGasCost(setting, m_gasUsed); io_test.setGasCost(setting, m_gasUsed);
return return
io_test.call().expectations.gasUsed.count(setting) > 0 && io_test.call().expectations.gasUsed.count(setting) > 0 &&