From: Kostya Serebryany Date: Wed, 6 Jan 2016 02:13:04 +0000 (+0000) Subject: [libFuzzer] extend the dictionary mutator to optionally overwrite data with the dict... X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=92ec084eaf82ca0078f07d0c95ac12837de0fb58 [libFuzzer] extend the dictionary mutator to optionally overwrite data with the dict entry git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256900 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Fuzzer/FuzzerMutate.cpp b/lib/Fuzzer/FuzzerMutate.cpp index c3fa37a435d..84ee18e69fb 100644 --- a/lib/Fuzzer/FuzzerMutate.cpp +++ b/lib/Fuzzer/FuzzerMutate.cpp @@ -117,11 +117,18 @@ size_t MutationDispatcher::Mutate_AddWordFromDictionary(uint8_t *Data, assert(!D.empty()); if (D.empty()) return 0; const Unit &Word = D[Rand(D.size())]; - if (Size + Word.size() > MaxSize) return 0; - size_t Idx = Rand(Size + 1); - memmove(Data + Idx + Word.size(), Data + Idx, Size - Idx); - memcpy(Data + Idx, Word.data(), Word.size()); - return Size + Word.size(); + if (Rand.RandBool()) { // Insert Word. + if (Size + Word.size() > MaxSize) return 0; + size_t Idx = Rand(Size + 1); + memmove(Data + Idx + Word.size(), Data + Idx, Size - Idx); + memcpy(Data + Idx, Word.data(), Word.size()); + return Size + Word.size(); + } else { // Overwrite some bytes with Word. + if (Word.size() > Size) return 0; + size_t Idx = Rand(Size - Word.size()); + memcpy(Data + Idx, Word.data(), Word.size()); + return Size; + } } size_t MutationDispatcher::Mutate_ChangeASCIIInteger(uint8_t *Data, size_t Size,