Skip to content

Modeling Implicit Instruction Dependencies in IR #75

@Chand-ra

Description

@Chand-ra

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions