diff --git a/fuzz/build.sh b/fuzz/build.sh new file mode 100644 index 0000000..5cbe87a --- /dev/null +++ b/fuzz/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +$CXX $CFLAGS $CXXFLAGS \ + -I $SRC/fast_float/include \ + -c $SRC/fast_float/fuzz/from_chars.cc -o from_chars.o + +$CXX $CFLAGS $CXXFLAGS $LIB_FUZZING_ENGINE from_chars.o \ + -o $OUT/from_chars \ No newline at end of file diff --git a/fuzz/from_chars.cc b/fuzz/from_chars.cc new file mode 100644 index 0000000..4517d4a --- /dev/null +++ b/fuzz/from_chars.cc @@ -0,0 +1,34 @@ +#include "fast_float/fast_float.h" +#include +#include +#include + +fast_float::chars_format arbitrary_format(FuzzedDataProvider &fdp) { + using fast_float::chars_format; + switch (fdp.ConsumeIntegralInRange(0,3)) { + case 0: + return chars_format::scientific; + break; + case 1: + return chars_format::fixed; + break; + case 2: + return chars_format::fixed; + break; + } + return chars_format::general; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + FuzzedDataProvider fdp(data, size); + fast_float::chars_format format = arbitrary_format(fdp); + double result_d = 0.0; + std::string input_d = fdp.ConsumeRandomLengthString(128); + auto answer = + fast_float::from_chars(input_d.data(), input_d.data() + input_d.size(), result_d, format); + std::string input_f = fdp.ConsumeRandomLengthString(128); + double result_f = 0.0; + answer = + fast_float::from_chars(input_f.data(), input_f.data() + input_f.size(), result_f, format); + return 0; +} \ No newline at end of file