diff --git a/test/tools/ossfuzz/Generators.h b/test/tools/ossfuzz/Generators.h index 2741f5af2..50f80b488 100644 --- a/test/tools/ossfuzz/Generators.h +++ b/test/tools/ossfuzz/Generators.h @@ -44,6 +44,7 @@ MACRO(AssignmentStmtGenerator) SEP \ MACRO(BlockStmtGenerator) SEP \ MACRO(ContractGenerator) SEP \ + MACRO(ExpressionStmtGenerator) SEP \ MACRO(FunctionCallGenerator) SEP \ MACRO(FunctionGenerator) SEP \ MACRO(ImportGenerator) SEP \ diff --git a/test/tools/ossfuzz/SolidityGenerator.cpp b/test/tools/ossfuzz/SolidityGenerator.cpp index dd06f2d2c..0b04edcf7 100644 --- a/test/tools/ossfuzz/SolidityGenerator.cpp +++ b/test/tools/ossfuzz/SolidityGenerator.cpp @@ -425,12 +425,24 @@ string AssignmentStmtGenerator::visit() return indentation() + lhs.value().second + assignOp(operation) + rhs.value().second + ";\n"; } +string ExpressionStmtGenerator::visit() +{ + ExpressionGenerator exprGen{state}; + auto randomType = TypeProvider{state}.type(); + auto expression = exprGen.rOrLValueExpression({randomType, {}}); + if (expression.has_value()) + return indentation() + expression.value().second + ";\n"; + else + return "\n"; +} + void StatementGenerator::setup() { set> dependsOn = { {mutator->generator(), 1}, {mutator->generator(), 1}, - {mutator->generator(), 1} + {mutator->generator(), 1}, + {mutator->generator(), 1} }; addGenerators(std::move(dependsOn)); } diff --git a/test/tools/ossfuzz/SolidityGenerator.h b/test/tools/ossfuzz/SolidityGenerator.h index 7e07364a5..00cf754a4 100644 --- a/test/tools/ossfuzz/SolidityGenerator.h +++ b/test/tools/ossfuzz/SolidityGenerator.h @@ -816,7 +816,6 @@ struct ExpressionGenerator std::pair& _typeName ); - void incrementNestingDepth() { nestingDepth++; @@ -1056,6 +1055,19 @@ private: static constexpr unsigned s_uncheckedBlockInvProb = 37; }; +class ExpressionStmtGenerator: public GeneratorBase +{ +public: + explicit ExpressionStmtGenerator(SolidityGenerator* _mutator): + GeneratorBase(std::move(_mutator)) + {} + std::string visit() override; + std::string name() override + { + return "Expression statement generator"; + } +}; + class AssignmentStmtGenerator: public GeneratorBase { public: