class Controller

Defined at line 9260 of file fidling/gen/src/sys/fuzzing/fidl/fuchsia.fuzzer/hlcpp/fuchsia/fuzzer/cpp/fidl.h

Provides the management interface for fuzzing.

This protocol is implemented by the fuzzing engine. Clients for this

protocol are provided by `fuchsia.fuzzer/ControllerProvider.Connect`.

The channel is closed when the fuzzer is no longer needed, and on error.

Clients should exit and not attempt to reconnect.

Public Methods

void ~Controller ()
void Configure (::fuchsia::fuzzer::Options options, ConfigureCallback callback)

Sets various execution and error detection parameters. This may be

called multiple times; only the most recently received options are used.

If the `Options` parameter omits one or more fields, those parameters

are unchanged in the fuzzer. Until the initial call to this method, the

fuzzer should assume the default values for `Options`.

+ request `options` the execution and error detection parameters.

* error one of the following:

* error

* `ZX_ERR_BAD_STATE` if a long-running call such as `Execute`,

`Cleanse`, `Minimize`, `Fuzz`, or `Merge` is in progress.

* `ZX_ERR_NOT_SUPPORTED` if a value provided for an option is not

supported by the engine. Check the logs for additional details.

void GetOptions (GetOptionsCallback callback)

Gets the current values for the various execution and error detection

parameters.

- response `options` the execution and error detection parameters.

void AddToCorpus (::fuchsia::fuzzer::Corpus corpus, ::fuchsia::fuzzer::Input input, AddToCorpusCallback callback)

Writes the provided `input` to either the "seed" or "live" `corpus`.

Returns an error if transferring the input fails; see `Input` for

details.

+ request `corpus` the type of corpus to add to.

+ request `input` the sequence of bytes to add as a test input.

* error one of the following:

* `ZX_ERR_INVALID_ARGS` if corpus type is invalid.

* A socket error if transferring the input fails.

void ReadCorpus (::fuchsia::fuzzer::Corpus corpus, ::fidl::InterfaceHandle< ::fuchsia::fuzzer::CorpusReader> corpus_reader, ReadCorpusCallback callback)

Connects a `corpus_reader` for either the "seed" or "live" corpus.

+ request `corpus` the type of corpus to read from.

+ request `corpus_reader` the client used to send test inputs.

void WriteDictionary (::fuchsia::fuzzer::Input dictionary, WriteDictionaryCallback callback)

Parses and loads an AFL-style dictionary. Invalid entries are logged and

skipped.

See also:

* https://github.com/mirrorer/afl/blob/master/dictionaries/README.dictionaries

+ request `dictionary` the AFL-style dictionary

* error one of the following:

* A socket error if transferring the input fails.

*`ZX_ERR_INVALID_ARGS` if parsing the dictionary fails.

void ReadDictionary (ReadDictionaryCallback callback)

Returns the current dictionary as an Input, which may be empty.

- response `dictionary` the current AFL-style dictionary.

void AddMonitor (::fidl::InterfaceHandle< ::fuchsia::fuzzer::Monitor> monitor, AddMonitorCallback callback)

Installs a `Monitor` to push status. To pull status instead, use

`GetStatus`.

+ request `monitor` the client used to send status updates.

void Fuzz (FuzzCallback callback)

Runs the normal fuzzing feedback loop:

1. Selects an input from the corpus.

2. Mutates the input.

3. Uses the `TargetAdapter` to execute the input.

4. Checks feedback from the `InstrumentedProcesses`.

5. If the input produced useful feedback, adds it to the corpus.

This call returns quickly, but the loop continues until one of three

conditions is met:

1. The configured, non-zero number of `runs` has been reached.

2. The configured, non-zero `duration` elapses.

3. An error is detected, and returned.

See `Result` for more details on long running workflows such as this

one.

* error `ZX_ERR_BAD_STATE` if another long-running workflow is in

progress.

void TryOne (::fuchsia::fuzzer::Input test_input, TryOneCallback callback)

Executes the target code with a single `test_input`.

See `Result` for more details on long running workflows such as this

one.

+ request `input` the sequence of bytes to use with the fuzz target.

* error one of the following:

* `ZX_ERR_BAD_STATE` if another long-running workflow is in

progress.

* A socket error if transferring the input fails.

void Minimize (::fuchsia::fuzzer::Input test_input, MinimizeCallback callback)

Attempts to find the smallest input that produces the same error as the

given `test_input`,

constrained by the configured `total_time` and/or `runs` options.

See `Result` for more details on long running workflows such as this

one.

+ request `input` the sequence of bytes to minimize.

* error one of the following:

* `ZX_ERR_BAD_STATE` if another long-running workflow is in

progress.

* A socket error if transferring the input fails.

* `ZX_ERR_INVALID_ARGS` if the provided `test_input` does not cause

an error.

void Cleanse (::fuchsia::fuzzer::Input test_input, CleanseCallback callback)

Attempts to replace bytes of the given `test_input` with "filler" bytes,

e.g.

,

, without changing the error produced.

See `Result` for more details on long running workflows such as this

one.

To preserve backwards compatibility with libFuzzer and ClusterFuzz, an

input that produces no result is *not* considered an error, and is

returned as-is.

+ request `input` the sequence of bytes to cleanse.

* error one of the following:

* `ZX_ERR_BAD_STATE` if another long-running workflow is in

progress.

* A socket error if transferring the input fails.

void Merge (MergeCallback callback)

Attempts to shrink the corpora. Inputs from the seed corpus will be

preserved. All other inputs will be sorted by amount of feedback

produced and input size, and only those inputs that add new feedback not

seen earlier in the sequence will be kept.

See `Result` for more details on long running workflows such as this

one.

* error one of the following:

* `ZX_ERR_BAD_STATE` if another long-running workflow is in

progress.

* `ZX_ERR_INVALID_ARGS` if an input in the seed corpus causes an

error. Inputs in the live corpus that cause errors are skipped.

void GetStatus (GetStatusCallback callback)

Returns various fuzzing metrics, e.g. total coverage, speed, etc.

- response `status` the current value of fuzzing metrics.

void WatchArtifact (WatchArtifactCallback callback)

Returns the results of a long-running workflow.

This method uses the

["hanging get" pattern](https://fuchsia.dev/fuchsia-src/development/api/fidl#hanging-get).

Upon the first call for a given connection, it will immediately return

the controller's current artifact. Upon subsequent calls, it will block

until the controller's artifact changes before returning. Clients should

use `GetStatus` to ensure the fuzzer is not idle before making a

blocking call to `WatchArtifact`.

Combined with the `Status.running` value obtained from `GetStatus`, this

allows a (re-)connecting client to infer the state of the fuzzer:

* If the fuzzer is idle and has an empty artifact, then it is

unchanged since the last connection, if any.

* If the fuzzer is running and has an empty artifact, then it is

performing a long-running workflow started by a previous connection.

The client may call `WatchArtifact` again to wait for the workflow

to complete.

* If the fuzzer is idle and has a non-empty artifact, then it has

completed a long-running workflow since the last connection.

It is not an error for clients to disconnect while waiting for a

response from this method. This method is intended to allow clients to

resume waiting for a long-running workflow to complete after

intentionally or inadvertently being disconnected for an indefinite

amount of time.

- response `artifact` the most recent result and/or error-causing input.