diff --git a/test/tools/ossfuzz/SolidityGenerator.cpp b/test/tools/ossfuzz/SolidityGenerator.cpp index e2f61c01c..d2389b1f3 100644 --- a/test/tools/ossfuzz/SolidityGenerator.cpp +++ b/test/tools/ossfuzz/SolidityGenerator.cpp @@ -359,9 +359,15 @@ string BlockStmtGenerator::visit() } else block << indentation() + "{\n"; + + // Create blockscope inside current function state + state->currentFunctionState()->scopes.push_back( + make_shared() + ); state->indent(); block << visitChildren(); state->unindent(); + state->currentFunctionState()->scopes.pop_back(); block << indentation() << "}\n"; return block.str(); } @@ -434,6 +440,10 @@ pair ExpressionGenerator::randomLValueExpression() liveVariables += state->currentFunctionState()->outputs | ranges::views::transform([](auto& _item) { return _item; }) | ranges::to>>(); + for (auto const& scope: state->currentFunctionState()->scopes) + liveVariables += scope->variables | + ranges::views::transform([](auto& _item) { return _item; }) | + ranges::to>>(); return liveVariables[state->uRandDist->distributionOneToN(liveVariables.size()) - 1]; } default: @@ -638,18 +648,18 @@ string FunctionCallGenerator::lhs(vector> _functio if (useExistingVars) { auto vars = assignToVars | - ranges::views::transform([](auto const& _item) { return _item.second.value().second; }) | - ranges::to>(); + ranges::views::transform([](auto const& _item) { return _item.second.value().second; }) | + ranges::to>(); callStmtLhs << "(" - << boost::algorithm::join(vars, ",") - << ") = "; + << boost::algorithm::join(vars, ",") + << ") = "; } else { auto newVars = _functionReturnTypeNames | ranges::views::transform([&](auto const& _item) -> string { state->currentFunctionState()->addLocal(_item.first); - string varName = state->currentFunctionState()->locals.back().second; + string varName = state->currentFunctionState()->scopes.back()->variables.back().second; return std::visit( GenericVisitor{[](auto const& _it) { return _it->toString(); }}, _item.first diff --git a/test/tools/ossfuzz/SolidityGenerator.h b/test/tools/ossfuzz/SolidityGenerator.h index 1c0a2a6f7..425b85f5e 100644 --- a/test/tools/ossfuzz/SolidityGenerator.h +++ b/test/tools/ossfuzz/SolidityGenerator.h @@ -418,6 +418,11 @@ struct SourceState std::string sourceName; }; +struct BlockScope +{ + std::vector> variables; +}; + struct FunctionState { enum class Params @@ -437,7 +442,7 @@ struct FunctionState { inputs.clear(); outputs.clear(); - locals.clear(); + scopes.clear(); } void addInput(SolidityTypePtr _input) { @@ -451,13 +456,13 @@ struct FunctionState } void addLocal(SolidityTypePtr _local) { - locals.emplace_back(_local, "l" + std::to_string(numLocals++)); + scopes.back()->variables.emplace_back(_local, "l" + std::to_string(numLocals++)); } std::string params(Params _p); std::vector> inputs; std::vector> outputs; - std::vector> locals; + std::vector> scopes; std::shared_ptr type; unsigned numInputs; unsigned numOutpus;