From e0d9dec87431b47737fd10212d4946915ad9c24b Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Mon, 14 Mar 2022 14:23:59 +0100 Subject: [PATCH] Permit control flow mutations in global scope of a Yul program. --- .../ossfuzz/protomutators/YulProtoMutator.cpp | 19 +++++++++++++++++++ .../ossfuzz/protomutators/YulProtoMutator.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/test/tools/ossfuzz/protomutators/YulProtoMutator.cpp b/test/tools/ossfuzz/protomutators/YulProtoMutator.cpp index f1f3fbc93..09001217d 100644 --- a/test/tools/ossfuzz/protomutators/YulProtoMutator.cpp +++ b/test/tools/ossfuzz/protomutators/YulProtoMutator.cpp @@ -73,6 +73,7 @@ static addControlFlow c4; static addControlFlow c5; static addControlFlow c6; static addControlFlow c7; +static addControlFlow c8; Literal* YPM::intLiteral(unsigned _value) { @@ -261,6 +262,24 @@ Block* YPM::basicBlock(T* _msg) return _msg->mutable_case_block(); else if constexpr (std::is_same_v) return _msg->mutable_block(); + else if constexpr (std::is_same_v) + return globalBlock(_msg); else static_assert(AlwaysFalse::value, "Yul proto mutator: non-exhaustive visitor."); } + +Block* YPM::globalBlock(Program* _program) +{ + switch (_program->program_oneof_case()) + { + case Program::kBlock: + return _program->mutable_block(); + case Program::kObj: + return _program->mutable_obj()->mutable_code()->mutable_block(); + case Program::PROGRAM_ONEOF_NOT_SET: + { + _program->set_allocated_block(new Block()); + return _program->mutable_block(); + } + } +} diff --git a/test/tools/ossfuzz/protomutators/YulProtoMutator.h b/test/tools/ossfuzz/protomutators/YulProtoMutator.h index e947a61c3..c6fd010ba 100644 --- a/test/tools/ossfuzz/protomutators/YulProtoMutator.h +++ b/test/tools/ossfuzz/protomutators/YulProtoMutator.h @@ -103,5 +103,7 @@ struct YulProtoMutator /// Obtain a basic block in a for stmt uniformly /// at random static Block* randomBlock(ForStmt* _msg); + /// Obtain a basic block in global scope. + static Block* globalBlock(Program* _program); }; }