blob: 50f0abb21d3ca9991096cd4d8d22fa8f41f643e6 [file] [log] [blame] [view]
---
title: Fuzz testing with libFuzzer
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
# Fuzz Testing with libFuzzer
The utilities library contains fuzz targets that can be built with
[LLVM libFuzzer](https://llvm.org/docs/LibFuzzer.html). Fuzzing is
enabled when using the Clang compiler and the `UTILS_LIBFUZZER` CMake
option.
## Building
Configure CMake with Clang and enable the libFuzzer option:
```bash
cmake \
-G Ninja \
-S . -B build \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DENABLE_FUZZING=ON
```
Build the fuzzer executables:
```bash
cmake --build build --parallel --target celix_properties_fuzzer celix_version_fuzzer celix_filter_fuzzer
```
## Corpus
The `corpus` directories for the fuzzers contain a few seed inputs, which help guide the initial fuzzing process.
More files can be added to these directories to improve coverage. The fuzzer will automatically use all files in the
specified corpus directory as starting points for mutation and exploration.
## Running
The resulting fuzzers accept standard libFuzzer command line options. For example, to run each fuzzer for 30 seconds
using the provided seed corpus and print coverage information:
```bash
./build/libs/utils/celix_filter_fuzzer -max_total_time=30 -print_coverage=1 ./build/libs/utils/filter_corpus
```
Replace `celix_filter_fuzzer` and `filter_corpus` with the appropriate fuzzer executable and corpus directory as needed.
To see a list of supported command-line flags, run the fuzzer executable with the `-help=1` option. For example:
```bash
./build/libs/utils/celix_filter_fuzzer -help=1
```
This will display all available LibFuzzer options.
## Continuous Fuzzing
A GitHub Actions workflow runs the fuzzer periodically. The workflow
configuration can be found at `.github/workflows/fuzzing.yml`.