Index: compiler-rt/lib/fuzzer/FuzzerLoop.cpp =================================================================== --- compiler-rt/lib/fuzzer/FuzzerLoop.cpp +++ compiler-rt/lib/fuzzer/FuzzerLoop.cpp @@ -627,11 +627,12 @@ assert(NewSize <= CurrentMaxMutationLen && "Mutator return oversized unit"); Size = NewSize; II.NumExecutedMutations++; - if (RunOne(CurrentUnitData, Size, /*MayDeleteFile=*/true, &II)) - ReportNewCoverage(&II, {CurrentUnitData, CurrentUnitData + Size}); + bool NewCov = RunOne(CurrentUnitData, Size, /*MayDeleteFile=*/true, &II); TryDetectingAMemoryLeak(CurrentUnitData, Size, /*DuringInitialCorpusExecution*/ false); + if (NewCov) + ReportNewCoverage(&II, {CurrentUnitData, CurrentUnitData + Size}); } } Index: compiler-rt/test/fuzzer/fuzzer-leak.test =================================================================== --- compiler-rt/test/fuzzer/fuzzer-leak.test +++ compiler-rt/test/fuzzer/fuzzer-leak.test @@ -3,7 +3,8 @@ RUN: %cpp_compiler %S/ThreadedLeakTest.cpp -o %t-ThreadedLeakTest RUN: %cpp_compiler %S/LeakTimeoutTest.cpp -o %t-LeakTimeoutTest -RUN: not %t-LeakTest -runs=100000 -detect_leaks=1 2>&1 | FileCheck %s --check-prefix=LEAK_DURING +RUN: rm -rf %t-corpus && mkdir -p %t-corpus +RUN: not %t-LeakTest -runs=100000 -detect_leaks=1 %t-corpus 2>&1 | tee %t.log | FileCheck %s --check-prefix=LEAK_DURING LEAK_DURING: ERROR: LeakSanitizer: detected memory leaks LEAK_DURING: Direct leak of 4 byte(s) in 1 object(s) allocated from: LEAK_DURING: INFO: to ignore leaks on libFuzzer side use -detect_leaks=0 @@ -11,6 +12,9 @@ LEAK_DURING-NOT: DONE LEAK_DURING-NOT: Done +// Verify leaking input was not added to corpus +RUN: not ls %t-corpus/$(grep 'Test unit written to ./leak-' %t.log | sed 's/.*-//') + RUN: not %t-LeakTest -runs=0 -detect_leaks=1 %S 2>&1 | FileCheck %s --check-prefix=LEAK_IN_CORPUS LEAK_IN_CORPUS: ERROR: LeakSanitizer: detected memory leaks LEAK_IN_CORPUS: INFO: a leak has been found in the initial corpus.