Skip to content

Commit

Permalink
Added a broadcast tracer
Browse files Browse the repository at this point in the history
  • Loading branch information
LPeter1997 committed Sep 29, 2024
1 parent acec6cf commit e9bf49c
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/Draco.Compiler.Fuzzer/TuiTracer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ public void InputFuzzStarted(SyntaxTree input, TargetInfo targetInfo)
this.fuzzStarts.Add(targetInfo.Id, this.stopwatch.Elapsed);
}

public void InputFuzzed(SyntaxTree input, TargetInfo targetInfo, CoverageResult coverageResult)
public void InputFuzzEnded(SyntaxTree input, TargetInfo targetInfo, CoverageResult coverageResult)
{
// Counters
++this.fuzzedInputCounter;
Expand Down
2 changes: 1 addition & 1 deletion src/Draco.Fuzzing/Fuzzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ private ExecutionResult GetExecutionResult(QueueEntry entry)
lock (this.tracerSync) this.Tracer.InputFaulted(input, faultResult);
}
var coverage = this.CoverageReader.Read(targetInfo);
lock (this.tracerSync) this.Tracer.InputFuzzed(input, targetInfo, coverage);
lock (this.tracerSync) this.Tracer.InputFuzzEnded(input, targetInfo, coverage);
var compressedCoverage = this.CoverageCompressor.Compress(coverage);
var isInteresting = this.IsInteresting(compressedCoverage);
var executionResult = new ExecutionResult(compressedCoverage, faultResult);
Expand Down
60 changes: 58 additions & 2 deletions src/Draco.Fuzzing/ITracer.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using Draco.Coverage;

namespace Draco.Fuzzing;
Expand Down Expand Up @@ -34,7 +35,7 @@ public interface ITracer<TInput>
/// <param name="input">The input that was fuzzed.</param>
/// <param name="targetInfo">The target information.</param>
/// <param name="coverageResult">The coverage of the input.</param>
public void InputFuzzed(TInput input, TargetInfo targetInfo, CoverageResult coverageResult);
public void InputFuzzEnded(TInput input, TargetInfo targetInfo, CoverageResult coverageResult);

/// <summary>
/// Called when a smaller input was found.
Expand Down Expand Up @@ -86,10 +87,65 @@ private NullTracer()
public void InputsEnqueued(IEnumerable<T> inputs) { }
public void InputDequeued(T input) { }
public void InputFuzzStarted(T input, TargetInfo targetInfo) { }
public void InputFuzzed(T input, TargetInfo targetInfo, CoverageResult coverageResult) { }
public void InputFuzzEnded(T input, TargetInfo targetInfo, CoverageResult coverageResult) { }
public void MinimizationFound(T input, T minimizedInput) { }
public void MutationFound(T input, T mutatedInput) { }
public void InputFaulted(T input, FaultResult fault) { }
public void FuzzerStarted() { }
public void FuzzerFinished() { }
}

/// <summary>
/// A tracer that broadcasts to multiple tracers.
/// </summary>
/// <typeparam name="T">The type of the input data.</typeparam>
/// <param name="tracers">The tracers to broadcast to.</param>
public sealed class BroadcastTracer<T>(IEnumerable<ITracer<T>> tracers) : ITracer<T>
{
private readonly List<ITracer<T>> tracers = tracers.ToList();

public void InputsEnqueued(IEnumerable<T> inputs)
{
foreach (var tracer in this.tracers) tracer.InputsEnqueued(inputs);
}

public void InputDequeued(T input)
{
foreach (var tracer in this.tracers) tracer.InputDequeued(input);
}

public void InputFuzzStarted(T input, TargetInfo targetInfo)
{
foreach (var tracer in this.tracers) tracer.InputFuzzStarted(input, targetInfo);
}

public void InputFuzzEnded(T input, TargetInfo targetInfo, CoverageResult coverageResult)
{
foreach (var tracer in this.tracers) tracer.InputFuzzEnded(input, targetInfo, coverageResult);
}

public void MinimizationFound(T input, T minimizedInput)
{
foreach (var tracer in this.tracers) tracer.MinimizationFound(input, minimizedInput);
}

public void MutationFound(T input, T mutatedInput)
{
foreach (var tracer in this.tracers) tracer.MutationFound(input, mutatedInput);
}

public void InputFaulted(T input, FaultResult fault)
{
foreach (var tracer in this.tracers) tracer.InputFaulted(input, fault);
}

public void FuzzerStarted()
{
foreach (var tracer in this.tracers) tracer.FuzzerStarted();
}

public void FuzzerFinished()
{
foreach (var tracer in this.tracers) tracer.FuzzerFinished();
}
}

0 comments on commit e9bf49c

Please sign in to comment.