diff --git a/test/tools/ossfuzz/Generators.h b/test/tools/ossfuzz/Generators.h index e02bddd7a..64b0d80b8 100644 --- a/test/tools/ossfuzz/Generators.h +++ b/test/tools/ossfuzz/Generators.h @@ -52,6 +52,7 @@ MACRO(FunctionGenerator) SEP \ MACRO(IfStmtGenerator) SEP \ MACRO(ImportGenerator) SEP \ + MACRO(MagicStmtGenerator) SEP \ MACRO(PragmaGenerator) SEP \ MACRO(SourceUnitGenerator) SEP \ MACRO(StatementGenerator) SEP \ diff --git a/test/tools/ossfuzz/SolidityGenerator.cpp b/test/tools/ossfuzz/SolidityGenerator.cpp index ee59e34b3..41f2ac802 100644 --- a/test/tools/ossfuzz/SolidityGenerator.cpp +++ b/test/tools/ossfuzz/SolidityGenerator.cpp @@ -658,7 +658,8 @@ void StatementGenerator::setup() {mutator->generator(), 1}, {mutator->generator(), 1}, {mutator->generator(), 1}, - {mutator->generator(), 1} + {mutator->generator(), 1}, + {mutator->generator(), 1} }; addGenerators(std::move(dependsOn)); } @@ -1597,6 +1598,40 @@ string FunctionCallGenerator::visit() return {}; } +string MagicStmtGenerator::visit() +{ + MagicId m = static_cast(uRandDist()->distributionOneToN(static_cast(MagicId::MAGICMAX) - 1)); + switch (m) + { + case MagicId::ASSERT: + { + ExpressionGenerator exprGen{state}; + auto boolType = make_shared(); + pair boolTypeName = {boolType, {}}; + auto expression = exprGen.rLValueOrLiteral(boolTypeName); + solAssert(expression.has_value(), ""); + return indentation() + + "assert(" + + expression.value().second + + ");\n"; + } + case MagicId::REQUIRE: + { + ExpressionGenerator exprGen{state}; + auto boolType = make_shared(); + pair boolTypeName = {boolType, {}}; + auto expression = exprGen.rLValueOrLiteral(boolTypeName); + solAssert(expression.has_value(), ""); + return indentation() + + "require(" + + expression.value().second + + ");\n"; + } + default: + solAssert(false, ""); + } +} + template shared_ptr SolidityGenerator::generator() { diff --git a/test/tools/ossfuzz/SolidityGenerator.h b/test/tools/ossfuzz/SolidityGenerator.h index 5c75e26f9..8c0555e75 100644 --- a/test/tools/ossfuzz/SolidityGenerator.h +++ b/test/tools/ossfuzz/SolidityGenerator.h @@ -1286,4 +1286,23 @@ private: std::optional rhs(std::vector>& _functionInputTypeNames); std::string callStmt(std::shared_ptr _callee); }; + +class MagicStmtGenerator: public GeneratorBase +{ +public: + enum class MagicId: size_t + { + ASSERT = 1, + REQUIRE, + MAGICMAX + }; + MagicStmtGenerator(SolidityGenerator* _mutator): + GeneratorBase(std::move(_mutator)) + {} + std::string visit() override; + std::string name() override + { + return "Magic statement generator"; + } +}; }