fmt/test/fuzzing
Paul Dreik 4db5723525
add fuzzers for chrono timepoint and localtime,gmtime (#2469)
* add fuzzers for chrono timepoint and localtime,gmtime

* reorder cases to improve throughput

mutating the first byte of the input now always results in picking
on of the two paths. Before, two of the four possible outcomes resulted
in doit() not being invoked.

* drop the localtime fuzzer

* inline aliases

* only fuzz std::chrono::system_clock
2021-08-29 06:58:23 -07:00
..
.gitignore
build.sh set clang in one place 2021-08-22 17:52:45 -07:00
chrono-duration.cc clang format 2021-08-22 17:52:45 -07:00
chrono-timepoint.cc add fuzzers for chrono timepoint and localtime,gmtime (#2469) 2021-08-29 06:58:23 -07:00
CMakeLists.txt add fuzzers for chrono timepoint and localtime,gmtime (#2469) 2021-08-29 06:58:23 -07:00
float.cc clang format 2021-08-22 17:52:45 -07:00
fuzzer-common.h fix UB in fuzzer common (memcpy on nullptr) 2021-08-22 17:52:45 -07:00
main.cc
named-arg.cc clang format 2021-08-22 17:52:45 -07:00
one-arg.cc clang format 2021-08-22 17:52:45 -07:00
README.md
two-args.cc clang format 2021-08-22 17:52:45 -07:00

Running the fuzzers locally

There is a helper script to build the fuzzers, which has only been tested on Debian and Ubuntu linux so far. There should be no problems fuzzing on Windows (using clang>=8) or on Mac, but the script will probably not work out of the box.

Something along

mkdir build
cd build
export CXX=clang++
export CXXFLAGS="-fsanitize=fuzzer-no-link -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION= -g"
cmake .. -DFMT_SAFE_DURATION_CAST=On -DFMT_FUZZ=On -DFMT_FUZZ_LINKMAIN=Off -DFMT_FUZZ_LDFLAGS="-fsanitize=fuzzer"
cmake --build .

should work to build the fuzzers for all platforms which clang supports.

Execute a fuzzer with for instance

cd build
export UBSAN_OPTIONS=halt_on_error=1
mkdir out_chrono
bin/fuzzer_chrono_duration out_chrono