Background
In our current IR, instruction dependencies are primarily defined by explicit data flow: an instruction is dependent on another if it consumes the dependee's output as an input. Mutators must respect these dependencies, and the following mutators do so in different ways:
InputSwapMutator: Sidesteps dependencies by only swapping inputs of matching types.
InstructionDeleteMutator: Sidesteps dependencies by identifying type-matching variables to replace references to a deleted instruction.
InstructionReorderMutator: Respects dependencies by ensuring instructions are not reordered if one consumes the other’s output.
The Problem
The IR does not currently capture implicit dependencies: semantic requirements where one operation must precede another despite having no direct data-flow link.
For example, A Recv* operation must always be preceded by a SendMessage operation. If a mutator (like reordering or deletion) breaks this implicit sequence, the program results in a 5-second timeout during execution. This significantly reduces fuzzing bandwidth and efficiency, and may lead to false positive hangs.
Proposed Goal
To achieve good fuzzing performance, we need a mechanism to represent these implicit dependencies within the IR. This will allow mutators to become more "structurally aware," ensuring they respect semantic ordering requirements and maintain greater program validity during mutation.
See Matt's comments on PR #60 and PR #61 for more context.
Background
In our current IR, instruction dependencies are primarily defined by explicit data flow: an instruction is dependent on another if it consumes the dependee's output as an input. Mutators must respect these dependencies, and the following mutators do so in different ways:
InputSwapMutator: Sidesteps dependencies by only swapping inputs of matching types.InstructionDeleteMutator: Sidesteps dependencies by identifying type-matching variables to replace references to a deleted instruction.InstructionReorderMutator: Respects dependencies by ensuring instructions are not reordered if one consumes the other’s output.The Problem
The IR does not currently capture implicit dependencies: semantic requirements where one operation must precede another despite having no direct data-flow link.
For example, A
Recv*operation must always be preceded by aSendMessageoperation. If a mutator (like reordering or deletion) breaks this implicit sequence, the program results in a 5-second timeout during execution. This significantly reduces fuzzing bandwidth and efficiency, and may lead to false positive hangs.Proposed Goal
To achieve good fuzzing performance, we need a mechanism to represent these implicit dependencies within the IR. This will allow mutators to become more "structurally aware," ensuring they respect semantic ordering requirements and maintain greater program validity during mutation.
See Matt's comments on PR #60 and PR #61 for more context.