diff --git a/CMakeLists.txt b/CMakeLists.txt index b2e2ad7b16bb..29b9dd58539a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,6 +308,7 @@ endif () # Control fuzzing independent of the unit tests. if (FMT_FUZZ) add_subdirectory(test/fuzzing) + target_compile_definitions(fmt PUBLIC FMT_FUZZ) endif () set(gitignore ${PROJECT_SOURCE_DIR}/.gitignore) diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h index 788eb8da5f7a..9cb362731156 100644 --- a/include/fmt/format-inl.h +++ b/include/fmt/format-inl.h @@ -1151,7 +1151,7 @@ int snprintf_float(T value, int precision, float_specs specs, for (;;) { auto begin = buf.data() + offset; auto capacity = buf.capacity() - offset; -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef FMT_FUZZ if (precision > 100000) throw std::runtime_error( "fuzz mode - avoid large allocation inside snprintf"); diff --git a/include/fmt/format.h b/include/fmt/format.h index 6b43aeac79d0..20433d1bd539 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -699,7 +699,7 @@ class basic_memory_buffer : public internal::buffer { template void basic_memory_buffer::grow(std::size_t size) { -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef FMT_FUZZ if (size > 1000) throw std::runtime_error("fuzz mode - won't grow that much"); #endif std::size_t old_capacity = this->capacity(); @@ -1136,7 +1136,7 @@ template class float_writer { *it++ = static_cast('0'); return it; } -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef FMT_FUZZ if (num_zeros > 1000) throw std::runtime_error("fuzz mode - avoiding excessive cpu use"); #endif diff --git a/src/format.cc b/src/format.cc index 680e6714180a..e6849b939c81 100644 --- a/src/format.cc +++ b/src/format.cc @@ -13,7 +13,7 @@ namespace internal { template int format_float(char* buf, std::size_t size, const char* format, int precision, T value) { -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef FMT_FUZZ if (precision > 100000) throw std::runtime_error( "fuzz mode - avoid large allocation inside snprintf"); diff --git a/test/fuzzing/README.md b/test/fuzzing/README.md index 0499d00cfc43..8f7a4536e364 100644 --- a/test/fuzzing/README.md +++ b/test/fuzzing/README.md @@ -7,14 +7,19 @@ in fmt. It is a part of the continous fuzzing at The source code is modified to make the fuzzing possible without locking up on resource exhaustion: ```cpp -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#ifdef FMT_FUZZ if(spec.precision>100000) { throw std::runtime_error("fuzz mode - avoiding large precision"); } #endif -``` -This macro is the defacto standard for making fuzzing practically possible, see -[the libFuzzer documentation](https://llvm.org/docs/LibFuzzer.html#fuzzer-friendly-build-mode). +``` +This macro `FMT_FUZZ` is enabled on OSS-Fuzz builds and makes fuzzing +practically possible. It is used in fmt code to prevent resource exhaustion in +fuzzing mode. +The macro `FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION` is the +defacto standard for making fuzzing practically possible to disable certain +fuzzing-unfriendly features (for example, randomness), see [the libFuzzer +documentation](https://llvm.org/docs/LibFuzzer.html#fuzzer-friendly-build-mode). ## Running the fuzzers locally