diff --git a/lib/Fuzzer/FuzzerDriver.cpp b/lib/Fuzzer/FuzzerDriver.cpp index 8c81c9d54e8..6cdbe4f34d6 100644 --- a/lib/Fuzzer/FuzzerDriver.cpp +++ b/lib/Fuzzer/FuzzerDriver.cpp @@ -335,10 +335,13 @@ int FuzzerDriver(const std::vector &Args, } if (AllInputsAreFiles()) { - Printf("%s: Running %zd inputs.\n", ProgName->c_str(), Inputs->size()); + int Runs = std::max(1, Flags.runs); + Printf("%s: Running %zd inputs %d time(s) each.\n", ProgName->c_str(), + Inputs->size(), Runs); for (auto &Path : *Inputs) { auto StartTime = system_clock::now(); - RunOneTest(&F, Path.c_str()); + while (Runs-- > 0) + RunOneTest(&F, Path.c_str()); auto StopTime = system_clock::now(); auto MS = duration_cast(StopTime - StartTime).count(); Printf("%s: %zd ms\n", Path.c_str(), (long)MS); diff --git a/lib/Fuzzer/test/CMakeLists.txt b/lib/Fuzzer/test/CMakeLists.txt index c9ccf9b565e..1443dc58eef 100644 --- a/lib/Fuzzer/test/CMakeLists.txt +++ b/lib/Fuzzer/test/CMakeLists.txt @@ -22,6 +22,7 @@ set(Tests MemcmpTest LeakTest NullDerefTest + NthRunCrashTest RepeatedMemcmp SimpleCmpTest SimpleDictionaryTest diff --git a/lib/Fuzzer/test/NthRunCrashTest.cpp b/lib/Fuzzer/test/NthRunCrashTest.cpp new file mode 100644 index 00000000000..03d03d00db6 --- /dev/null +++ b/lib/Fuzzer/test/NthRunCrashTest.cpp @@ -0,0 +1,15 @@ +// Crash on the N-th execution. +#include +#include +#include + +static int Counter; + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + if (Counter++ == 1000) { + std::cout << "BINGO; Found the target, exiting\n"; + exit(1); + } + return 0; +} + diff --git a/lib/Fuzzer/test/fuzzer.test b/lib/Fuzzer/test/fuzzer.test index a38e6a208ec..aadff795ed4 100644 --- a/lib/Fuzzer/test/fuzzer.test +++ b/lib/Fuzzer/test/fuzzer.test @@ -53,10 +53,16 @@ RUN: echo aaa > %tmp/SINGLE_INPUTS/aaa RUN: echo bbb > %tmp/SINGLE_INPUTS/bbb RUN: LLVMFuzzer-SimpleTest %tmp/SINGLE_INPUTS/aaa %tmp/SINGLE_INPUTS/bbb 2>&1 | FileCheck %s --check-prefix=SINGLE_INPUTS RUN: rm -rf %tmp/SINGLE_INPUTS -SINGLE_INPUTS: LLVMFuzzer-SimpleTest: Running 2 inputs. +SINGLE_INPUTS: LLVMFuzzer-SimpleTest: Running 2 inputs 1 time(s) each. SINGLE_INPUTS: aaa: SINGLE_INPUTS: bbb: RUN: not LLVMFuzzer-LeakTest -runs=10 2>&1 | FileCheck %s --check-prefix=LEAK LEAK: ERROR: LeakSanitizer: detected memory leaks LEAK-NOT: DEATH: + +RUN: echo abcd > %t/NthRunCrashTest.in +RUN: LLVMFuzzer-NthRunCrashTest %t/NthRunCrashTest.in +RUN: LLVMFuzzer-NthRunCrashTest %t/NthRunCrashTest.in -runs=10 +RUN: not LLVMFuzzer-NthRunCrashTest %t/NthRunCrashTest.in -runs=10000 2>&1 | FileCheck %s +RUN: rm %t/NthRunCrashTest.in