~~~~~~~
Fuzzing
~~~~~~~

.. include:: prologue.rst

Principle
=========

BRLTTY has some support for testing it through fuzzing, i.e. feeding it with
more or less random content, to check that it does not fall into pieces.

Building
--------

Building with fuzzing support is

   CC=clang ./configure --enable-api-fuzzing

(Fuzzing is only supported with the clang compiler)

This will also enable the address and undefined-behavior sanitizers.

Running
-------

To start a fuzzing session, one has to set the fuzz BrlAPI parameter, for
instance to start 1000 fuzzing loops:

   ./run-brltty -b xw -x no -A fuzz=1000 -n -e

It can be useful to try different fuzzing seeds with:

   ./run-brltty -b xw -x no -A fuzz=1000,fuzzseed=1234 -n -e

The initial steps of BrlAPI connections are not fuzzed by default, so the fuzzer
does not have to get it right before fuzzing the rest of the protocol. To fuzz
these initial steps, one can use:

   ./run-brltty -b xw -x no -A fuzz=1000,fuzzhead=on -n -e

Conversely, one can concentrate the fuzzing on the writeText operation only (in
latin1) with:

   ./run-brltty -b xw -x no -A fuzz=1000,fuzzwrite=on -n -e

And in utf8:

   ./run-brltty -b xw -x no -A fuzz=1000,fuzzwriteutf8=on -n -e

Reproducing
-----------

Once a bug is detected by the fuzzer, it emits a crash file. One can reproduce
the behavior with:

   ./run-brltty -b xw -x no -A crash=crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 -n -e

and use gdb etc. at will to understand the bug, and eventually check when it is
fixed.
