blob: 24d020ae4ea6d30da3e4bf87b6d2cafa8871434c [file] [log] [blame] [view] [edit]
# Overview
This document provides links and knowledge about fuzzing libavif on oss-fuzz.
# Fuzzing AVIF locally
You need to build with the following CMake flags:
```sh
-DAVIF_CODEC_AOM=LOCAL -DAVIF_CODEC_AOM_DECODE=ON -DAVIF_CODEC_AOM_ENCODE=ON -DAVIF_CODEC_DAV1D=LOCAL -DAVIF_LIBYUV=LOCAL -DAVIF_LIBSHARPYUV=LOCAL -DAVIF_BUILD_TESTS=ON -DAVIF_ENABLE_GTEST=ON -DAVIF_GTEST=LOCAL -DAVIF_FUZZTEST=LOCAL -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DAVIF_ENABLE_WERROR=OFF
```
You can then run your tests as normal:
```sh
ctest --output-on-failure -R fuzztest
```
In case of error, an `FUZZTEST_PRNG_SEED` variable is printed. You can then use
it to re-run your test, e.g. :
```sh
FUZZTEST_PRNG_SEED=wDH4mhJJCJa1aCoRe-yN-Jlzqn7oa9RxFnltRR1y1_A ctest --output-on-failure -R ^avif_fuzztest_enc_dec$
```
# Fuzzing AVIF on oss-fuzz
## Creating targets
[fuzztest](https://github.com/google/fuzztest/) is the framework of choice. Any
fuzztest test declared in libavif/tests/CMakeLists.txt will be picked up and
added to the list.
## Links
If you have the credentials, the main page
[https://oss-fuzz.com](https://oss-fuzz.com) links to:
- the [crashes](https://oss-fuzz.com/testcases?project=libavif&open=yes) :
some tests do not have a bug created. They are flaky, duplicates. Still, it
is worth going over the list in case there is a flaky true positive.
- the
[stats](https://oss-fuzz.com/fuzzer-stats?project=libavif&fuzzer=libFuzzer&job=libfuzzer_asan_libavif&group_by=by-fuzzer)
for the different fuzzers
- the link to the fuzz introspector report:
[https://oss-fuzz-introspector.storage.googleapis.com/index.html](https://oss-fuzz-introspector.storage.googleapis.com/index.html)
You can see the status of all projects:
[https://introspector.oss-fuzz.com/indexing-overview](https://introspector.oss-fuzz.com/indexing-overview)
or just the page for libavif:
[https://introspector.oss-fuzz.com/project-profile?project=libavif](https://introspector.oss-fuzz.com/project-profile?project=libavif)
## Gotchas
The
[build.sh](https://github.com/AOMediaCodec/libavif/blob/a98fa4f760eacc26aa33ed396640253e29786cce/tests/oss-fuzz/build.sh#L1)
file used to build the fuzzers has a few tricks because fuzztest is only
compatible with libfuzzer so only build the tests for libfuzzer:
- [https://github.com/AOMediaCodec/libavif/blob/a98fa4f760eacc26aa33ed396640253e29786cce/tests/oss-fuzz/build.sh\#L81](https://github.com/AOMediaCodec/libavif/blob/a98fa4f760eacc26aa33ed396640253e29786cce/tests/oss-fuzz/build.sh#L81)
- do not forget extra flags:
[https://github.com/AOMediaCodec/libavif/blob/a98fa4f760eacc26aa33ed396640253e29786cce/tests/oss-fuzz/build.sh\#L61](https://github.com/AOMediaCodec/libavif/blob/a98fa4f760eacc26aa33ed396640253e29786cce/tests/oss-fuzz/build.sh#L61)
## Testing locally
When you have your local checkout of
[https://github.com/google/oss-fuzz](https://github.com/google/oss-fuzz), you
can build the different fuzzers locally following instructions at
[https://google.github.io/oss-fuzz/getting-started/new-project-guide/\#testing-locally](https://google.github.io/oss-fuzz/getting-started/new-project-guide/#testing-locally)
If you have a special branch you want to test on, just modify
[projects/libavif/Dockerfile](https://github.com/google/oss-fuzz/blob/2e0110a1e36a4cdc18f0d91f48475a7759e7e80a/projects/libavif/Dockerfile#L22)
and clone your branch, e.g.:
```
git clone --depth 1 --branch my_awesome_branch
```
Then run:
```
python3 infra/helper.py build_image libavif
python3 infra/helper.py build_fuzzers --sanitizer <address/memory/undefined> libavif
```
There are actually other sanitizers you should run to get the previously
mentioned pages to be updated: ***coverage*** and ***introspector***.
```
python3 infra/helper.py build_fuzzers --sanitizer <coverage/introspector> libavif
```
There is a final thing to check that does not appear in the libavif CI:
```
python3 infra/helper.py check_build --sanitizer <address/memory/undefined> libavif
```
## More debugging
If check\_build times out, you might need to debug the oss-fuzz code itself,
like in infra/base-images/base-runner/bad\_build\_check. You then need to
rebuild the dockers:
```
docker build -t gcr.io/oss-fuzz-base/base-runner "$@" infra/base-images/base-runner
```
If you need to get into your docker and debug your code from there:
```
python3 infra/helper.py shell libavif
```
Once in there, you can install anything you need through apt.